IPC机制学习
文章目录
1)IPC基础及概念
2)Binder机制
3)IPC方式
IPC基础及概念
- 1.多进程模式
- 进程与线程
- 进程,一般指一个执行单元,在PC和移动设备上指一个程序或应用
- 线程,CPU调度的最小单元
- 一个进程可包含多个线程,即一个应用程序上可以同时执行多个任务
- 开启多进程的方式
- 在AndroidMnifest中给四大组件指定属性
android:process
- 进程名的命名规则:
- 以":"开头的进程,属于当前应用的私有进程
- 完整命名,属于全局进程
- 在AndroidMnifest中给四大组件指定属性
- 查看进程信息的方法
- 通过DDMS视图查看进程信息
- 多进程造成的影响
- 静态变量和单例模式失效
- 线程同步机制失效
- SharedPreference的不可靠性下降
- Applcation多次创建
- Android系统会为新的进程分配独立的虚拟机,相当于系统又把这个应用重新启动了一次
- 进程与线程
- 2.序列化
- 含义
- 将一个对象转换成可存储或传输的状态,序列化后的对象可以在网络上进行传输,也可以存储到本地
- 需要通过Intent和Binder等传输类对象就必须完成对象的序列化过程。
- 静态成员变量属于类,不属于对象,所以它和和用transient关键字标记的成员变量不参与序列化。
- 实现方式
-
Serializable
- Java的序列化接口,将一个对象转换成可存储或可传输的状态
- 简单但效率较低,开销大
- 适合将对象序列化到存储设备或者将对象序列化到网络设备传输
- 序列化后的数据中的serialVersionUID要和当前类的serialVersionUID相同才能正常的序列化
-
Parcelable
- Android的序列化接口,将一个对象进行分解,且分解后的每一部分都是传递可支持的数据类型
- 高效但比较麻烦
- 用在内存的序列化
-
- 含义
Binder机制
- 1.概念
- 是一个类,实现
IBinder
接口 - 是Android中的一种跨进程通信的方式
- ServiceManager连接各种Manager和相应的ManagerService的桥梁
- 是一个类,实现
- 2.优点
- a.传输效率高、可操作性强。传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高
- 对于消息队列、Socket和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝
- 对于Binder来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程
- b.实现C/S架构方便
- c.安全性高
- a.传输效率高、可操作性强。传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高
- 3.角色
- Server,Client,ServiceManager和Binder驱动
- ServiceManager:服务的管理者,将Binder名字转换为Client中对该Binder的引用,使得Client可以通过Binder名字获得Server中Binder实体的引用
- Server和Client:服务端与客户端,在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信
- Server,Client,ServiceManager和Binder驱动
- 4.工作原理
- 服务器端:在服务端创建好了一个Binder对象后,内部就会开启一个线程用于接收Binder驱动发送的消息,收到消息后会执行onTranscat(),并按照参数执行不同的服务端代码。
- Binder驱动:在服务端成功Binder对象后,Binder驱动也会创建一个mRemote对象(也是Binder类),客户端可借助它调用transcat()即可向服务端发送消息。
- 客户端:客户端要想访问Binder的远程服务,就必须获取远程服务的Binder对象在Binder驱动层对应的mRemote引用。当获取到mRemote对象的引用后,就可以调用相应Binder对象的暴露给客户端的方法。
IPC方式
- 跨进程通信,两个进程之间进行数据交换的过程
- 应用场景:
- 某些模块因特殊原因要运行在单独线程中
- 为加大一个应用可使用的内存,需要用过多进程来获取多份内存空间
- 1.使用Bundle
- 支持在Activity、Service和Receiver之间通过Intent.putExtra()传递Bundle数据。
- 2.文件共享
- 无并发访问情形,交换简单的数据实时性不高的场景
- 3.AIDL
- 如果在一个进程中要调用另一个进程中对象的方法,可使用AIDL生成可序列化的参数,AIDL会生成一个服务端对象的代理类,通过它客户端实现间接调用服务端对象的方法。
- AIDL的本质是系统提供了一套可快速实现Binder的工具
- 4.Messager
- 轻量级的IPC方案,通过它可在不同进程中传递Message对象
- 5.ContentProvider
- 是Android提供的专门用来进行不同应用间数据共享的方式
- 除了onCreat()运行在UI线程中,其他的query()、update()、insert()、delete()和getType()都运行在Binder线程池中。
- 6.Socket
- 不仅可以跨进程,还可以跨设备通信
- 流套接字
- 基于TCP协议,采用流的方式提供可靠的字节流服务。
- 数据报套接字
- 基于UDP协议,采用数据报文提供数据打包发送的服务。
- 不能在主线程中访问网络
参考
《Android开发艺术与探索》
关于Android多进程
要点提炼|开发艺术之IPC