IPC机制
1、IPC简介
IPC是Inter-Process Communication的缩写,含义是进程间通信,是指两个进程之间进行数据交换的过程。在Android中,最有特色的进程间通信方式就是Binder了,通过Binder可以轻松地实现进程间通信。
Android还支持Socket,通过Socket可以实现任意两个终端之间的通信。
2、多进程模式
Android中使用多进程只有一种方法,那就是给四大组件在AndroidManifest中指定android:process属性。还有一种非常规的多进程方法,那就是通过JNI在native层去fork一个新的进程,这种方法属于特殊情况,不是常用的创建多进程的方式。
实现跨进程通信的方式很多,比如通过Intent来传递数据,共享文件和SharedPreferences,基于Binder的Messager和AIDL以及socket等。
3、Serializable接口
Serializable是Java所提供的一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化操作。想让一个对象实现序列化,只需要这个类实现Serializable接口并声明一个serialVersionUID即可。如果不声明这个serialVersionUID同样也可以实现序列化,但是这将会对反序列化过程产生影响。
静态成员变量属于类不属于对象,所以不会参与序列化过程。
用transient关键字标记的成员变量不参与序列化过程。
4、Parcelable接口
Parcelable接口也可以用来实现序列化,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。
系统已经为我们提供了许多实现了Parcelable接口的类,它们都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它们里面的每个元素都是可序列化的。
5、Parcelable和Serializable的区别
Serializable接口是Java中的序列化接口,使用起来简单但是开销大,序列化和反序列化过程需要大量I/O操作。主要用在将对象序列化到存储设备中或者将对象序列化通过网络传输。
Parcelable是Android中的序列化方式,更适合用在Android平台上,缺点是使用起来稍微麻烦点,但是效率高。主要用在内存序列化上。
6、Binder
a、直观上说,Binder是Android中的一个类,它实现了IBinder接口;
b、从IPC角度来说,Binder是Android中的一种跨进程通信方式;
c、Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有;
d、从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager)和相应ManagerService的桥梁;
e、从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。
7、Android中的IPC方式
a、Bundle:四大组件中的三大组件(Activity,Service,BroadcastReceiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。
b、文件共享:这是一种不错的进程间通信方式,两个进程通过读、写同一个文件来交换数据。
c、Messenger:可以翻译为信使,即它可以在不同进程中传递Message对象。这是一种轻量级的IPC方案,它的底层实现是AIDL。它是以串行方式处理客户端发来的信息。它的主要作用是为了传递消息,很多时候我们可能需要跨进程调用服务端的方法,Messenger无法做到,但是AIDL可以。
d、AIDL:AIDL是Messenger的底层实现。一般分为服务端和客户端。AIDL是一种最常见的进程间通信方式,是日常开发中涉及进程间通信时的首选。使用AIDL的大概流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法了。
e、ContentProvider:这是Android中提供的专门用于不同应用间进行数据共享的方式。底层实现是Binder。
f、Socket:通过它来进程进程间的通信,可以使两个终端中的进程在计算机网络中通信。
名称 | 优点 | 缺点 | 适用场景 |
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程间通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的即时通信 | 无并发访问情形,交换简单的数据实时性不高的场景。 |
AIDL | 功能强大,支持一对多并发通信,支持实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 不能很好处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 | 低并发的一对多即时通信,无RPC需求,或者无须要返回结果的RPC需求 |
ContentProvider | 在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 | 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 | 实现细节稍微有点繁琐,不支持直接的RPC | 网络数据交换 |