IPC简介
IPC是
Inter-Process Communication
的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。进程和线程
线程是CPU调度的最小单元,同时线程是一种有限的系统资源。进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含关系。Android中的多进程模式
在Android中使用多进程方法,一种是给四大组件在AndroidMenifest中指定android:process属性。
另外一种就是通过JNI在Native层fork一个新的进程。
开启新进程的两种方式
<activity android:name="cn.dzws.android.scrollrespondUtils.activity.RecyclerViewActivity" android:process=":remote"/> (1) <activity android:name="cn.dzws.android.scrollrespondUtils.activity.ScrollViewActivity" android:process="cn.dzws.android.scrollrespondUtils.remote"/>(2)
进程名以
:
开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。进程名不以:
开头的进程属于全局进程,其他应用可以通过ShareUID方式可以和它跑在同一个进程中。
两个应用通过ShareUID跑在同一个进程中是有要求的,需要这两个应用有相同的ShareUID并且签名相同才可以。多进程模式的运行机制,以及多进程带来的问题。
public class UserManager { public static int userUid = 1; } (1)RecyclerViewActivity先将userUid赋值为2 (2)ScrollViewActivity获取到的userUid还为1
每个进程都会分配一个独立的虚拟机,不同的虚拟机在内存上分配有不同的地址空间,这就导致不同的虚拟机中访问同一个类对象会产生多份副本。
所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据都会共享失败,这也是多进程带来的主要影响。Serializable、Parcelable、Binder
Serializable
和Parcelable
接口为数据序列化接口。
Serializable
需要指定serialVersionUID
(可以手动指定也可以由编译器自动生成)序列化和反序列化时两者serialVersionUID
是相同的就可以正常进行操作。
如果不手动指定serialVersionUID
这个值则会随着当前类的数据结构变化而变化,导致反序列化失败造成程序crash
;
Serializable
主要是通过io流进行将数据读写到本地来进行持久化的。
Parcelable
是Android平台提供的数据序列化接口,主要用在内存序列化上。
Binder
是Android
中的一个类,实现了IBinder接口,从IPC
角度来说Binder
是Android
中的一种跨进程通信方式,Binder
还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder/
,它还是客户端和服务端进行通信的媒介。
个人理解:Binder
基本原理是 进程间将数据序列化存储至/dev/binder/
,再由另外进程将数据进行反序列化取出,至此完成了进程间的通信(Binder机制是一个很深入的话题,现在只提基本原理,不聊上层实现细节。)