序列化、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,否则缓存会把存储打满。