跨进程通信

IPC全称 Inter-Process Communication 是进程间通信,是指两个进程间进行数据交换的过程。

IPC机制的使用场景

(1)Android对单个应用使用的最大内存做了限制(16M),需要获取更多的内存.
(2)当前应用需要向其他应用获取数据

开启多进程模式的唯一方法是在清单文件中设置process属性。

例如 android:process=”:remote” 或 android:process=”com.lzx.app.remote”
第一种是一种简写,完整是这样的:android:process=”com.lzx.app:remote” 第二种是一种完整的写法,带有“:”符号的属于当前应用的私有进程

Parcelable接口

Parcelable接口是Android中实现序列化和反序列化的接口。并可以通过Intent和Binder传递。

注意Parcelable接口中的Parcel参数,Parcel是一个偏底层的东西。内部包装了可序列化的数据,可以在Binder中自由传输。

序列化功能由writeToParcel方法来完成,通过Parcel的一系列wirte方法来完成的。

反序列化功能由CREATOR来完成,内部表明了如何创建序列化对象和数组,通过Parcel的一系列read方法完成

Binder

  • Binder非常复杂和重要,它继承了IBinder接口。
  • 从IPC角度看,Binder是Android中一种跨进程通信的方式。
  • 从Android Framework角度看,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager)和相应ManagerService的桥梁
  • 从应用层的角度看,Binder是客户端和服务端进行通信的媒介
  • 在开发中,Binder主要用在Service,如果是普通的Service,Binder不涉及进程间通信。

Android中的IPC方式

(1)Bundle
因为Intent支持传递Bundle数据,而且Bundle实现了Parcelable接口,所以可以方便的进行进程间传输。

(2)使用文件共享
使用文件要注意一个问题,就是并发读/写的问题,有可能读出的内容有可能不是最新的,并发写的话就更严重,
因此尽量避免并发写这种情况的发生或者靠虑使用线程同步来限制多个线程的写操作。
注意,SharedPreferences是个特例,虽然它属于文件的一种,但是系统对它的读/写有一定的缓存策略,所以在多进程模式下,
系统对它的读/写变得不可靠,当面对高并发的读/写时,SharedPreferences很大几率会丢失数据。
所以,不建议在进程间通信中使用SharedPreferences。

(3)使用Messenger
Messenger通过它可以在不同进程中传递Message对象。底层实现是AIDL。构造方法:

1
2
3
4
5
6
public Messenger(Handler target){
mTarget = target.getIMessenger();
}
public Messenger(IBinder target){
mTarget = IMessenger.Stub.asInterface(target);
}

同时它一次处理一个请求,因此在服务端不用考虑线程同步问题。因为Messenger是以串行的方式处理客户端发来的消息,如果大量消息同时发送,服务端只能一条条处理。

(4)使用AIDL
AIDL

(5)使用ContentProvider
ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式。实现增删查改方法。如果要扩展,实现call方法。

(6)使用Socket
Socket可以实现终端与终端之间的通信,那么它肯定可以实现进程之间的通信,不过用得较少,因为它是比较偏网络方面的。

contrast.png