IPC是Inter-Process Communication的缩写,含义是进程间通信,是指两个进程间交换数据的过程. 首先要区别什么是进程什么是线程:按照操作系统的描述线程是CPU调度的最小单元,是一种有限的系统资源. 而进程一般指一个执行单元,在PC和移动端指一个应用或者程序.因此进程和线程是包含和被包含的关系.
IPC不是android系统特有的,Linux上可以通过命名管道、共享内容、信号量等来进行进程间通信.而对于android是基于Linux内核的移动操作系统,它的进程间通讯继承自Linux,也有自己的进程间通讯方式. 在android中最有特 {MOD}的就是Binder了,通过Binder可以轻松地实现进程间的通讯,也可以通过socket来实现两个终端或者一个设备上面的两个进程来进行通讯
在android中使用多进程有两种方法:1.给四大组件指定android:process属性 2.通过JNI在native层去fork一个新的进程,下面是一个android中创建多进程的例子:
上述两个activity的process属性有什么区别呢,":remote"是在当前进程名前附加上当前的包名,这是一种简写方法.而对"com.fanday.remote"是一种完整的命名方式,不会附加包名信息;其次":"开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以":"开头的进程属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中. android系统会为每一个应用分配一个唯一的UID,具有相同UID的应用才能共享数据.要说明的是两个应用通过ShareUID跑在同一个进程中是有要求的,需要两个应用具有相同的shareUID并且签名也相同才可以.在这种情况下,他们可以互相访问对方的私有数据,比如data目录、组件信息,还可以共享内存数据,或者说就像是一个应用的两个部分.
IPC进程间通讯存在的问题就是数据共享问题,比如说存在一个公共类
class CommonData{
public static int num=1;
}
在SecondActivity中修改num=2;在ThirdActivity中访问得到的num还是1.这个问题出现的原因是SecondActivity运行在一个独立的进程中,我们知道android为每一个应用分/进程配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多个副本.拿这个例子来说,在MainActivity和SecondActivity的进程中都存在一个CommonData类.并且这两个类互不干扰.
所有运行在不同进程中的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败,这也是多线程带来的主要影响.正常情况下,不同进程的四大组件之间不可能不通过一些中间层来共享数据.一般来说,使用多进程会造成如下几个方面的问题:
1.静态成员和单例模式完全失效
2.线程同步机制完全失效
3.SharePreference的可靠性下降
4.Application会多次创建
第一个问题已经进行了分析,第二个问题本质上和第一个是类似的,;既然不是一块内存了,那么无论是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象.第三个问题是SharePreference不支持两个进程同时进行读写操作,否则会导致一定几率的数据丢失,这是因为sp底层是操作xml文件,并发读写都会出现问题.第四个当一个组件跑在一个进程中时,由于系统创建进程的时候会分配独立的虚拟机,这个过程就相当于创建新的应用过程