关键词:ipC 方式 / 共享文件 / ContentPRovider / Messenger / Intent + extras / Socket / Bundle
本次笔记梳理了所有可以进行跨进程通信的常见方式,包括使用 Bundle、使用文件共享、使用 Messenger、使用 AIDL、使用 ContentProvider、使用 Socket。
[ 还有几点需要知道 ]
对象是不能跨进程直接传输的,对象的跨进程传输本质上都是反序列化的过程,这就是为什么 AIDL 中自定义对象都必须要实现 Parcelable 接口的原因;虽然说多次跨进程传输客户端的同一个对象会在服务端生成不同的对象,但是这些新生成的对象有一个共同点,那就是它们底层的 Binder 对象是同一个;客户端调用远程服务的方法,被调用的方法运行在服务端的 Binder 线程池中,同时客户端线程会被挂起,服务器端方法不能执行耗时的方法(如果是客户端是 UI 线程的话),防止 ANR;客户端的 onServiceConnected 和 onServiceDisconnected 方法都运行在 UI 线程中,所以也不可以在它们里面直接调用服务端的耗时方法;流式套接字
和 用户数据报套接字
;流式套接字对应着网络中传输控制层的 TCP 协议;用户数据报套接字对应着网络中传输控制层的 UDP 协议;Socket 本身可以支持传输任意字节流,实现信息的传输,是一种 IPC 方式;实际上,通过 Socket 不仅仅能实现进程间的通信,还可以实现设备之间的通信(前提是这些设备之间的 IP 地址相互可见);/ 名称 / | / 优点 / | / 缺点 / | / 适用场景 / |
---|---|---|---|
/ Bundle / | / 简单易用 / | / 只能支持 Bundle 支持的数据类型 / | / 四大组件之间的进程间通信 / |
/ 文件共享 / | / 简单易用 / | / 不适合高并发场景,并且无法做到进程间的即时通信 / | / 无并发访问情形,交换简单的数据,实时性不高的场景 / |
/ AIDL / | / 功能强大,支持一对多并发通信,支持实时通信 / | / 使用稍复杂,需要处理好线程同步 / | 一对多通信且有 RPC 需求 / |
/ Messenger / | / 功能一般,支持一对多串行通信,支持实时通信 / | / 不能很好地处理高并发情形,不支持 RPC,数据通过 Message 进行传输,因此只能传输 Bundle 支持的数据类型 / | / 低并发的一对多即时通信,无 RPC 需求,或者无要返回结果的 RPC 需求 / |
/ ContentProvider / | / 在数据源访问方面功能强大,支持一对多并发数据共享,可通过 Call 方法扩展其他操作 / | / 可以理解为受约束的 AIDL,主要提供数据源的 CRUD 操作 / | 一对多的进程间的数据共享 |
/ Socket / | / 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 / | / 实现细节稍微有点繁琐,不支持直接的 RPC / | / 网络数据交换 / |
End.
Note by HF. Learn from 《Android 开发艺术探索》
新闻热点
疑难解答