Android IPC简介
IPC含义:进程间通信,是指两个进程间尽享数据交换。
多进程使用场景:
- 应用根据业务需求需要多进程来实现
- 为了加大一个应用可使用的内存所以需要多进程来获取多份内存空间。
Android中的多进程模式
一般情况下指一个应用存在多个进程。在Android中使用多进程只有一种办法,就是给四大组件(Activity、Service、Receiver、ContentProvider)在清单文件中指定android:process属性,除此之外没有别的办法。其实还有一种特殊的,就是通过JNI在native曾去fork一个新的进程。
示例:
进名称以 “ :” 开头的进程属于当前应用的私有进程,其它应用组件不可以和它跑在同一个进程里。 不以“:”开头的是全局进程,其他应用可以通过ShareUID方式可以和它泡在同一个进程中。
Android系统会为每个应用分配一个唯一的ShareUID,具有相同UID的应用才能共享数据。 两个应用通过ShareUID跑在同一个进程中是有要求的,需要这两个应用有相同的ShareUID并且签名才可以。这样它们可以互相访问私有数据了。
多进程模式的运行机制
我们在SecondActivity中创建了一个类,然后在这个类中有一个public的静态成员变量。
然后我们在MainActivity中修改sUserID的值为2,然后我们打印日志看一下:
上述问题出现问题分析:我们知道Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上又不同的地址空间,这就导致在不同的虚拟机中访问一个类对象会产生多份副本。所以我们修改了进程SecondActivity的值后, 而进程MainActivity的值没有变化。这是核心原因。
所以我们总结一下多进程总结问题:
- 1、所有运行在不同进程的四大组件,只要通过内存来共享数据的都会共享失败
- 2、静态成员和单例模式完全失效
- 3、线程同步机制完全失效
- 4、SP的可靠性下降
- 5、Application 会多次创建
第1、2、3个问题:都因为不是一块内存了,所以会有问题的,至于线程同步也是如此,锁住的对象也不是同一个内存地址的对象所以会有问题。
第4个问题:SP不支持两个进程同时去读写,否则一定几率会丢失数据,因为SP地城是通过读写XML来实现的,并发写显然是可能实现问题的。
第5个问题:当一个组建跑在一个新的进程中,系统会同时分配独立的虚拟机,这个过程其实就是启动一个应用,启动应用肯定就重新启动Application,所以会有多个Application。
本节介绍了多进程带来的问题,然后我们在去理解IPC就简单多了。
序列化的两种方式
之所以这里介绍序列化是因为: 对象是不能跨进程传输的, 对象的跨进程传输本质上都是反序列化的过程
Serializable接口
1、这是Java提供的一个序列化接口,它是一个空接口,只需要将对象实现这个接口即可。非常简单。
2、采用ObjectOutputStream和ObjectInputStream即可轻松实现。
上面演示了采用Serializable方式序列化对象的典型过程,很简单,只需要把实现了Serializable接口的User对象写到文件中就可以了恢复了,但是注意恢复后的对象newUser和user的内容完全一样,但是两者不是同一个对象。
3、然后我们解释一下serialVersionUID,
序列化的时候系统会把当前的serialVersionUID写入序列化的文件中(也可能是中介),当反序列的时候系统回去检测文件中的serialVersionUID,看它是否和当前类的版本相同,这个时候可以成功反序列化;否则说明当前类和序列化相比发生了某些变化,比如成员变量的数量发生了,都无法反序列化成功。
Parcelable接口
这是android提供的序列化接口,一