IPC(Inter-Process Communication)进程间通信或者跨进程通信
1. 进程和线程:线程是CPU调度的最小单元,进程指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以有多个线程,但只有一个主线程。
2. 任何一个操作系统都有IPC机制:
(1)Windows:通过剪切板、管道、邮槽来进行进程间通信。
(2)Linux:命名管道、共享内存、信号量等来进行进程间通信。
(3)Androd:binder、Socket
3. Android中使用多进程只有一个办法:给Android的四大组件在AndroidMenifest中指定Android:process属性。Eclipse里的DDMS可以查看进程信息,adb shell ps|grep 包名也可以。
4.Android 系统会为每个应用分配一个唯一的UID,只有相同UID的应用才能共享数据。
两个应用可以通过ShareUid跑在同一个进程中,签名还必须相同。在这种情况下,它们可以互相访问对方的私有数据,比如data目录,组件信息,共享内存数据。
5.静态变量是可以在所有的地方共享的,并且一处有修改处处都会同步。
Public static int sUserId =1;
6.系统会为每一个应用分配一个独立的虚拟机,不同的虚拟机在内存上分配有不同的地址空间。这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。所以,运行在不同进程的四大组件不可能不通过一些中间层来共享数据,简单的指定进程名来开启多进程是不行的。
四、IPC的基础概念
1.Serializable接口:
作用:通过Intent和Binder传输数据
把对象持久化到储存设备上或者通过网路传输给其他客户端
1. 为对象提供标准的序列化和反序列化操作
2. 对象的序列化过程:
(1)定义一个Person类,实现Serializable接口
(2)序列化和反序列化Person类对象
IPC方式---Binder
1. binder机制是为了帮助Android的进程间通信。
2. Binder通信的时候采用的是C/S架构,一个进程要访问另外一个进程,本进程叫客户端,被访问的进程叫服务端。
3. Aidl:是客户端和服务端进行进程间通信的时候采用的都能懂的一个口头桥梁。
4. 被访问的服务端都会在Binder驱动的共享内存产生一个binder引用,binder引用实际是存的是B进程里AIDL的描述,进程A的AIDL存的标识,与B进程里AIDL的标识吻合,就是实现了访问。
如图:
5. aidl如何与binder之间沟通:
代码演示:
(1)
(2)
(3)实际上一个Aidl文件分两部分一个存根一个代理。
6. Aidl源代码分析:
IBinderTest.java就是aidl自动编译产生的文件。
进程间通信---AIDL
1. 使用流程
服务端
(1)服务端创建一个Service来监控客户端的连接请求
(2)创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明。
(3)实现这个AIDL接口
客户端
(1)绑定服务端的Service
(2)将服务端返回的Binder对象转成AIDL接口所属的类型
(3)调用AIDL中的方法