一、学习目的:
1、理解Android多进程概念以及多进程开发模式中常见的注意事项
2、理解Android中的序列化机制和Binder
3、掌握Bundle、文件共享、AIDL、Messenger、ContentProvider和Socket等进程间通信的方式
4、理解Binder连接池的概念,掌握各种进程间通信的优缺点和使用场景
二、基础概念
1、IPC:进程间通信或者跨进程通信
2、线程:CPU调度的最小单元,是一种有限的系统资源
3、进程:一个执行单元,在PC和移动设备上指一个程序或者应用。一个进程可包含多个线程,也可只有一个线程,即主线程。Android里边UI线程也叫主线程,操作界面元素。如果进程中需要执行耗时任务,则需要开启子线程执行该任务,否则会出现ANR异常
4、IPC形式
1)、Windows:剪贴板、管道、油槽
2)、Linux:命名管道、共享内容、信号量
3)、Android:
a、Binder----进程间通信
b、Socrket----终端间通信;等
三、Android中多进程模式
1、Android多进程模式:通常指一个应用中存在多个进程的情况
1)、开启
a、常规方式:清单文件中为四大组件指定android:process属性,值为进程名,“:”开头表示在当前名称前附加包名,属于当前应用私有进程;不以“:”开头的是完整命名方式,属于全局进程,其他应用的组件可通过ShareUID方式和它跑在同一个进程。默认进程名是包名。
b、特殊方式:JNI在native层fork一个新进程,不常用。
c、Android系统会为每个应用分配唯一一个UID,具有相同UID的应用可共享数据;若应用的签名也相同,则可相互访问对方的私有数据;再通过ShareUID方式跑在同一个进程,则可以共享内存数据
2)、运行机制
a、Android为每个进程分配独立的虚拟机,对应内存上不同的地址空间,会导致四大组件在不同进程中运行时通过内存共享数据的失败。具体包括:静态成员和单利模式失效、线程同步失效、SharedPreferences可靠性下降、Application多次创建
b、一个应用的多进程相当于多个应用采用SharedUID模式
四、IPC实现跨进程共享内存数据
1、基本概念
1)、对象的序列化和持久化:
a、Serializable接口:Java中的接口,为对象提供标准的序列化和反序列化操作,使用简单但开销很大,需要大量IO操作。多用于持久化到存储设备或者通过网络传输给其他客户端时的持久化。类实现接口并声明serialVersionUID。
..............................
b、Parcelablei接口:Android中的序列化方式,通常用作内存序列化,多用于Intent和Binder传递数据时的序列化
2)Binder
a、从IPC角度来看,是一种跨进程通信方式,可理解为一种虚拟的物理设备;从Android Framework角度来说,是ServerceManager连接各种Manager和ManagerService的桥梁;从Android引用层来说,是客户端和服务端通信的媒介。
b、Android中Binder主要用于Service中,包括AIDL和Messenger。普通Service中Binder无意义,Messenger底层实现是AIDL
c、运行机制:
2、实现方式
1)、Bundle
2)、文件共享:SharedPreferences由于存在缓存策略,不建议使用
3)、Messenger:信使,实现在不同进程间传递Message对象,Message中存放数据,从而实现数据传递
a、服务端进程
b、客户端进程
4)、AIDL:
5)、ContentProvider
6)、Socket
3、Binder连接池
4、IPC方式选择
名称 | 优点 | 缺点 | 适用场景 |
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程通信 |
文件共享 | 简单易用 | 不适合高并发,且不支持即使通信 | 无并发访问情形,交换简单 的数据实时性不高的场合 |
AIDL | 功能强大,支持一对多并发通信,支持实时通信 | 使用稍复杂,需处理线程同步 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 只能传输Bundle支持的数据类型,不适合高并发,不支持RPC | 低并发的一对多即使通信,无RPC需求,或者无须返回结果的RPC需求 |
ContentProvider | 在数据源访问方面功能强大,支持一对多并发通信,可通过Call方法扩展其他操作 | 受约束的AIDL,主要提供数据源的CRUD操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,支持一对多并发实时通信,可通过网络传输字节流 | 使用稍复杂,不支持直接的RPC | 网络数据交换 |