Android IPC简介
IPC是Inter-ProcessCommutication的缩写,是进程间通信的意思 ,而进程是由线程组成的,线程是CPU调度的最小单元。
多进程产生的问题
1、静态变量和单例模式完全失效
2、线程同步机制完全失效
3、SharePrefernces的可靠性降低
4、Application会被多次创建
实现Android跨进程通信的方式
名称 | 优点 | 缺点 | 适用场景 |
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进 程间的及时通信 | 无并发访问情形,交换简单 的数据实时性不高的场景 |
AIDL | 功能强大。支持一对多 并发通信,支持实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行 通信,支持实时通信 | 不能很好的处理高并发情形,不支持 RPC,数据通过Messenger进行传输, 因此只能传输Bundle支持的数据类型 | 低并发的一对多的即时通信, 无RPC需求,或者无需要返回 结果的RPC需求 |
ContentProvider | 在数据源方面访问方面强大, 支持一对多并发数据共享,可 通过Call方法扩展其他操作 | 可以理解成受约束的AIDL,主要提供 数据源的CRUD操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,可以通过网络传输 字节流,支持一对多并发实时通信 | 实现细节稍微繁琐,不支持直接的RPC | 网络数据交换 |
实现Android跨进程通信的要点
要想在线程间实现线程通信那么对象必须能够序列化,类实现序列化的方法有两种
一 实现Serializable接口,作为系统序列化和反序列化的标记,再次我们要注意,给类增加ID,在反序列化时能够识别为同一个类。
二 实现Parcelable接口
public class Book implements Parcelable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Book() {
}
public Book(int id, String name) {
this.id = id;
this.name = name;
}
protected Book(Parcel in) {
this.id=in.readInt();
this.name=in.readString();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;//返回对象的内容描述,如果含有文件描述返回1,几乎所有情况都返回0
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(id);
parcel.writeString(name);
}
}
这两种序列化的方式中Serializable使用比较简单,但是开销大,效率比较低,适合相对较小的数据。Parcelable则使用起来稍
复杂,但是Android推荐序列化方式,开销小,效率比较高。
Binder
Binder是一个类,一个实现了IBinder接口的类,从IPC的角度来讲它是一种跨进程的通信方式,从Framwork角度来讲,Binder是ServiceManager
链接各种manager(ActivityManager 、WindowManager等)和相应ManagerService的桥梁。具体可以通过AIDL来了解。
介绍了相关的IPC知识那么下一篇我们将介绍IPC具体的实现方法。