序列化、IPC、事件总线、后台任务——Android 里跨进程和跨线程通信的几种方式。
一、跨进程:序列化与 IPC
Android序列化机制
Android 序列化让对象能进 Intent、持久化或跨进程。Java Serializable 简单但慢且不安全;Parcelable 是平台推荐的高性能方案,字段要手写或用代码生成。Bundle 对类型有限制,自定义对象必须先变成 Parcelable。
跨版本要处理字段增删,serialVersionUID 或稳定的 parcel 顺序不能乱。进程间传输有 Binder 大小限制,超大对象应走文件或共享内存。不要把敏感信息明文序列化进磁盘。
新项目可评估 Kotlin Parcelize 或 Protocol Buffers。调试时打印 hex 帮助对齐字段。崩溃常见于类名混淆后反序列化找不到类,ProGuard 规则要保留。
Android IPC - AIDL
AIDL: 每一个进程都有自己的 Dalvik VM 实例,都有自己的一块独立的内存,都在自己的内
存上存储自己的数据,执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。
而 aidl 就类似与两个进程之间的桥梁,使得两个进程之间可以进行数据的传输,跨进程通
信有多种选择,比如 BroadcastReceiver , Messenger 等,但是 BroadcastReceiver 占用
的系统资源比较多,如果是频繁的跨进程通信的话显然是不可取的;Messenger 进行跨进
程通信时请求队列是同步进行的,无法并发执行。
Android 进程间通信(IPC)
Linux IPC:
-
socket
-
共享内存
Android IPC:
-
Binder
-
AIDL
-
广播
-
Messenger
-
intent
-
contentProvider
IPC库:
Justson/flying-pigeon: flying-pigeon 是一个IPC 跨进程通信组件,底层是匿名内存+Binder , 突破1MB大小限制,无需写AIDL文件,让实现跨进程通信就像写一个接口一样简单
二、组件通信与事件分发
Android事件总线EventBus和RxBus
EventBus 用注解订阅 + 反射/索引分发事件,RxBus 则把 Subject 当总线。两者都能解耦页面,但也让跳转关系变隐式,生命周期忘反注册就会泄漏。新项目更推荐 Flow/LiveData/接口回调。
EventBus 的 ThreadMode 决定投递线程,sticky 类似粘性广播。RxBus 要注意 Subject 类型:Publish 不缓存,Behavior 带最近值,Serialized 保证并发。ProGuard 要 keep 订阅方法。
若必须维护旧代码,把事件收口到单一模块,禁止跨层乱抛。替换路径是:界面状态走 ViewModel,一次性结果走 Channel,全局用显式接口而不是字符串事件名。
Android 事件分发机制
-
View事件分发机制
-
ViewGroup事件分发机制
-
Touch 事件传递流程
-
事件分发中的 onTouch 和 onTouchEvent 有什么区别,又该如何使用?
-
View 和 ViewGroup 分别有哪些事件分发相关的回调方法
三、后台任务
Android JobScheduler
JobScheduler 让系统在充电、空闲或联网时调度后台任务,比自己持有唤醒锁更省电。JobService 在约束满足时回调,任务应尽快完成或自己切到前台服务。WorkManager 在更高层封装了它和 Alarm。适合同步、清理缓存、延迟上传,不适合毫秒级精确闹钟。
约束要写真实需求,全开等于立刻跑,失去批处理意义。任务幂等,因为可能重试。Android 版本对后台限制越来越严,测试要覆盖 Doze。调试用 adb dumpsys jobscheduler。不要用它绕过后台限制做常驻。JobScheduler 是与系统协商窗口,不是定时器。把耗电操作集中到窗口内,用户和应用都更轻松。
IntentService
IntentService 在工作线程排队处理每个 Intent,处理完自动停掉,适合短任务串行执行。它内部自带 HandlerThread,onHandleIntent 不要再开自己的无线循环。Android 8 之后后台限制让它逐渐被 JobIntentService 和 WorkManager 取代。
仍能在旧代码里见到:下载、同步和日志上报。任务要幂等,因为系统可能重投递。前台服务要求提高后,长时间任务必须带通知,否则会被杀掉。
新代码优先 WorkManager:约束条件、退避重试和进程死后续跑都更完整。迁移时对照原 Intent extras,保证同一套业务参数能进 Worker。
四、系统集成
Android App Links
Android App Links 把 https 链接直接打开到应用内对应页面,而不是先弹出选择器。需要在 Manifest 声明 intent-filter,并在网站放置 Digital Asset Links 文件证明域名归属。
验证失败会退化为普通 Deep Link,用户仍要选打开方式。调试用 adb 查看验证状态,确认 sha256 指纹与签名证书一致。多环境域名要分别配置。网页与 App 路径应对齐,避免打开空白页。应用未安装时链接仍应打开可用网页。发布新签名证书后记得更新 assetlinks.json。这是留存回流的基础能力,比自定义 scheme 更安全可预期。
Android 本地缓存+网络
Android 本地缓存加网络的典型模式是:先读磁盘或内存展示,同时发起请求,成功后更新缓存并刷新界面。Room、DataStore 和 OkHttp 缓存层可以分工:结构化数据进数据库,配置进 DataStore,HTTP 响应按 Cache-Control 处理。
一致性策略要明确:以网络为准、以缓存为准,还是合并冲突。过期时间、ETag 和失败重试决定用户看到的是新鲜数据还是过期数据。弱网下要有占位和错误态,避免空白屏。
注意线程:磁盘读写不在主线程,LiveData/Flow 观察要能取消。大图和列表分页别整页塞进缓存。清理策略按配额和 LRU,否则缓存会把存储打满。
Android 通信与组件速查:序列化、IPC、事件总线
https://lautung.com/archives/android-ipc-components
评论