Android中的IPC方式

Bundle

Activity、Service、Receiver都是支持Intent中传递Bundle数据的

Bundle实现了Parcelable 接口,所以它可以方便地在不同的进程间传输。当我们在一个进程中启动另外一个进程的Activity、Service、Receiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。(传输的数据必须可以被序列化)

ContentProvider

天生就支持跨进程访问

AIDL

功能强大的IPC方式,ContentProvider和Messenger底层都是通过其实现。

网络通讯

通过网络通信也可以实现数据传递,所以Socket也可以实现IPC

使用文件共享

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

windows中,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读和写
Android基于Linux,其并发读/写文件可以没有限制地进行,甚至两个线程同时对同一个文件进行写操作都是运行的(尽管这可能出问题)

使用Messenger

可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以轻松地实现数据的进程间传递了。

Messager是一种轻量级IPC方案,它的底层实现时AIDL,它对AIDL进行了封装。

各种IPC方式对比

名称

优点

缺点

适用场景

Bundle

简单

只能传递Bundle支持的类型

四大组件间的进程间通讯

文件共享

简单

1.不适合高并发场景 2.无法做到进程间的即时通信

无并发访问情形,交换简单的数据实时性不高的场景

AIDL

功能强大,支持一对多并发通信,支持实时通信

使用稍复杂,需要处理好线程同步

一对多通信

Messager

功能一般,支持一对多串行通信,支持实时通信

不能很好处理高并发情形,只支持Bundle支持的数据类型(数据要通过Message进行传输)

低并发的一对多即时通信

ContentProvider

在数据访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作

可理解为受约束的AIDL,主要提供数据源的CRUD操作

一对多的进程间的数据共享

Socket

功能强大,可以通过网络传输字节流,支持一对多并发实时通信

实现稍微繁琐

网络数据交换

其他

参考 《Android开发艺术探索》