Android IPC

IPC(Inter-Process Communication)的几种方式

  • 文件共享
  • Bundle
  • AIDL(Messenger)
  • Socket
  • ContentProvider

文件共享

两个进程间通过读/写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取这个文件来获取数据

Bundle

作为四大组件交换数据的基本对象,其本身就支持在多线程中传递。

Intent.migrateExtraStreamToClipData();
Intent.prepareToLeaveProcess();

AIDL

常规AIDL

基于Binder的进程通信语言。

通过该语言,Android在编译的时候回自动生成对应的Binder接口实现类以及相关代理。

Messenger

对轻量级进程通信提供的快捷方式,实际上还是通过AIDL实现的。

Socket

来源于网络编程中的“套接字”,即对C端和S端通信协议的封装,常规来说只要指定了协议,那么就可以用它来通信,详见https://www.areahash.com/?p=423

ContentProvider

内容提供者,Android提供的通过URI形式获取轻量数据的一种方式。

小结

  • AIDL,ContentProvider都是 通过Binder机制实现进程通信的。

  • 几种方式的优缺点:

名称 优点 缺点 适用场景
Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件间的进程通信
文件共享 简单易用 并不适合高并发场景,并且无法做到进程间的及时通信 无高并发访问情形,交换简单的数据实时性不高的场景
AIDL 功能抢到,支持一对多并发通信,支持实时通信 使用稍复杂,需要处理好线程同步 一对多通信且有RPC需求
Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 低并发的一对多即时通信,无RPC需求,或者无需要返回结果的RPC需求
ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间数据共享
Socket 功能抢到,可以通过网络传输字节流,支持一对多并发实时通信 实现细节繁琐,不支持直接的RPC 数据交换

RPC:远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.