一:简介:IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信。
二:使用多进程可能产生的问题
我们知道Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机上访问同一个类型的对象会产生多分副本。所以运行在不同进程的四大组件,只要他们之间通过内存共享数据,都会共享失败。一般会造成如下几个方面的问题:
(1)静态成员和单例模式完全失效
(2)线程同步机制失效
(3)SharedPreferences的可靠性下降
(4)Application会创建多次
原因分析:
1和2的问题本质是类似的,因为在不同的进程中访问的对象不是同一个,同样锁的对象也不是同一个。第三个问题,SP不支持两个进程同事去执行写操作,否则会导致一定几率的数据丢失。第四个问题可以这样理解,运行在不同进程的组件是属于两个不同的虚拟机和Application的。
三:Android中的IPC方式
3.1 IPC方式的优缺点和适用场景
名称 |
优点 |
缺点 |
适用场景 |
Bundle |
简单易用 |
只能传输Bundle支持的数据类型 |
四大组件间的进程间的通信 |
文件共享 |
简单易用 |
不适合高并发场景,并且无法做到进程间的即时通信 |
无并发访问的情形,交换简单的数据实时性不高的场景 |
AIDL |
功能强大,支持一对多并发通信,支持实时通信 |
使用复杂,需要处理好线程同步的问题 |
一对多通信且有RPC需求 |
Messager |
功能一般,支持一对多串行通信,支持实时通信 |
不能很好的处理高并发情形,不支持RPC,数据通过message传输,因此只能传输bundler支持的数据类型 |
低并发的一对多的即时通信,无RPC需求,或者无需要返回结果的RPC需求 |
ContentProvider |
在数据源访问方面功能强大,支持一对多并发数据共享,可通过call方法扩展其他操作 |
可以理解为受约束的AIDL,主要提供数据源的CRUD操作 |
一对多的进程间的数据共享 |
Socket |
功能强大,可以通过网络传输字节流,支持一对多并发实时通信 |
实现细节稍微有点繁琐,不支持直接的RPC |
网络数据交换 |
3.2说明
RPC:RPC(Remote Procedure Call)——远程过程调用,RPC强调的是调用、即一个进程直接调用另外一个进程中的方法,比如客户端调用服务端的方法。
通过上面表格的分析。本文只对bundle、aidl、contentprovider和socket进行讲解