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开发艺术探索》