android中使用多进程通过给四大组件指定android:process属性,也可以通过JNI在native层去fork一个新的进程
进程名以“:”开头的进程属于当前应用的私有进程,不以“:”开头的进程属于全局进程
使用多进程造成的问题:
静态成员和单例模式失效
线程同步失效
SharedPreferences的可靠性下降
Application会被多次创建
IPC主要包含:Serializable接口、Parcelable接口以及Binder
Serializable和Parcelable接口可以完成对象的序列号过程
Serializable接口:是java提供的一个序列号接口,是一个空接口,为对象提供标准的序列化和反序列化操作,使用简单但是开销很大,序列化和反序列化过程需要大量I/O操作
使用:public class Test implements Serializable{}
Parcelable接口:主要用于内存序列化,是android中的序列化方式,缺点是使用起来麻烦点,但是效率很高
Binder:是android中的一个类,实现了IBinder接口。从IPC角度说Binder是android中的一种跨进程通信方式。还可以理解为一种虚拟的物理设备,设备驱动是/dev/binder
android开发中,Binding主要用在Service中,包括AIDL和Messenger
使用Bundle:android中的三大组件(Activity、Service、Receiver)都支持在Intent中传递Bundle数据,由于Bundle实现了Parcelable接口,所以他可以方便的在不同的进程间传输
使用文件共享:两个进程通过读/写同一个文件来交换数据。文件共享方式适合在对数据同步要求不高的进程之间进行通讯,并且要处理并发读/写的问题,SharedPreferences是个特例,由于系统对他的读/写有缓存策略,因此在多进程模式下,系统对他的读/写变的不可靠,面对高并发的读/写访问,有很大几率丢失数据,不建议在进程间通信中使用SharedPreferences
使用Messenger:Messenger是一种轻量级的IPC方案,底层实现是AIDL。以串行的方式处理客户端发来的消息,如果大量消息同时发送,服务端仍然一个个处理,那么用Messenger就不合适了
使用AIDL:
AIDL支持的数据类型:
基本数据类型(int、long、char、boolean、double等)
String和CharSequence
List:只支持ArrayList,集合中元素必须能被AIDL支持
Map:值支持HashMap,集合中元素必须能被AIDL支持,包括key和value
Parcelable:所有实现了Parcelable接口的对象
AIDL:所有的AIDL接口本身也可以在AIDL中使用
(1)服务端创建一个Service来监听客户端的连接请求,创建AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口
(2)客户端绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,然后就可以调用AIDL中的方法了
(3)AIDL接口的创建
package com.test.test.aidl;
import com.test.test.aidl.Dog;
interface IDogManager{
List
void addDog(Dog dog)
}
使用ContentProvider:ContentProvider是android中专门用于不同应用间进行数据共享的方式、天生就适合进程间通信。底层实现是Binder
ContentProvider主要以表格的形式来组织数据,并且可以包含多个表,除了表格的形式,ContentProvider还支持文件数据
使用Socket:Socket也称“套接字”是网络通信中的概念,分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层的TCP和UDP协议,关于TCP和UDP的介绍请看另一篇文章:xxxxxxx
使用Socket需要声明权限
Binder连接池
Binder连接池的主要作用就是将每个业务模块的Binder请求同意转发到远程Service中去执行,从而避免了重复创建Service的过程
Bundle
优点:简单易用
缺点:只能传输Bundle支持的数据类型
适用场景:四大组件间的进程通信
文件共享
优点:简单易用
缺点:不适合高并发场景,并且无法做到进程间的即时通信
适用场景:无并发访问情形,交换简单的数据实时性不高的场景
AIDL
优点:功能强大、支持一对多并发通信,支持实时通信
缺点:使用比较复杂,需要处理好线程同步
使用场景:一对多通信且有RPC需求
Messenger
优点:功能一般,支持一对多串行通信,支持实时通信
缺点:不能很好处理高并发,不支持RPC,数据通过Message进行传输,只能传递Bundle支持的数据类型
适用场景:低并发的一对多即时通信,无RPC需求,或者无须返回结果的RPC需求
ContentProvider
优点:在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作
缺点:可以理解为受约束的AIDL,主要提供数据源的CRUD操作
适用场景:一对多的进程间的数据共享
Socket
优点:功能强大,可以通过网络传输字节流,支持一对多并发实时通信
缺点:实现细节稍微烦琐,不支持直接的RPC
适用场景:网络数据交换