IPC是Inter-process Communication的缩写,含义为进程间通信或者夸进程通信,指的是两个进程之间进行数据交换的过程。
在Android中最有特色的进程间通信方式就是Binder了 ,通过Binder可以轻松的实现任意练个功终端之间的通信。除了Binder ,Android还支持Socket,通过Socket也可以实现任意两个终端之间的通信。多进程的情况分为两种:第一种是 一个应用因为某些原因自身需要采用多进程模式来实现,至于原因,可能有很多,比如,有些模块由于特殊原因需要运行在单独的进程中,又或者为了加大一个应用可使用的内存所以需要通过多进程来获取多份内存,Android对单个应用所使用的最大可使用的内存做了限制,早起的一些版本可能是16MB,不同设备有不同的大小。另一种情况是当前应用需要向其他应用获取数据,由于是两个应用,所以必须采用跨进程的方式来获取所需要的数据,甚至我们通过系统提供的ContentProvider去查询数据的时候,其实也是一种进程间通信。只不过,通信细节被系统内部屏蔽了,所以我们无法感知而已。
Android中的多进程模式
正常情况下,在Android中多进程是指一个应用中存在多个进程的情况,因此这里不讨论两个 应用之间的多进程情况、首先,在Android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:procress属性,除此之外没有别的方法,也就是说我们无法给一个线程或者一个实体类指定其运行时所在的进程。其实还有另一种非常规的多进程方法,那就是通过JNI在native层去fork一个新的进程。但是这种方法属于特殊情况,也不是常用的穿件多进程的方式。因此我们暂时不考虑这种方式。
下面给示例:
<service
android:name="com.zxx.binderframework.server.MessengerService"
android:process="com.zxx.binderframework.remote" >
</service>
<service
android:name="com.zxx.binderframework.aidl.server.BookManagerService"
android:process=":remote" >
</service>
上面展示了两种指定进程的方式。activity和这个方式是 一样的。当启动MessengerService的时候系统会为他创建一个单独的进程,进程名字为"com.zxx.binderframework.remote" 当启动BookManagerService的时候系统也会为他创建一单独的进程,进程名字为“com.zxx.binderframework.remote”两种指定命名的方式区别在于,“:” 的含义是指要在当前的进程名前面附加上当前的报名,这是 一种间歇的方法,对于另一个来说,他是一种完整的命名方式,不会附加包名信息,其次,进程名以";" 开头的进程属于当前应用的私有进程,其他应用的组件不可以和他泡在一个进程中,而进程名不以";"开头的进程属于全局进程,其他应用通过S哈热UID方式可以和他跑在同一个进程中。
我们知道Android系统会为每一个应用分配一个唯一的UID,具有相同UID的应用才能共享数据,这里要说明的是,两个应用通过ShareUID跑在同一个进程中是有要求的。需要这两个应用有相同的ShareUID并且签名相同才可以,在这种情况下,他们可以互相访问对方的私有数据。比如,data目录,组件信息等,不管他们是否跑在同一个进程中。当然,如果他们跑在同一个进程中,那么除了能共享data目录,组件信息,还可以共享内存数据,或者说,他们看起来就像是一个应用的两个部分。
ok,今天先写到这里。只是对于IPC做了很表层的介绍,后面会继续对于IPC进行深入的探索。
网友评论