第2章 IPC机制
1. Android 中的多进程模式
- 使用多进程的方法:
- 在 AndroidManifest 中指定 android:process属性;
- 通过 JNI 在 native 层去 fork 一个新的进程;(非常规)
- android:process 进程命名:进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过 ShareUID 方式可以和它跑在同一个进程中。
- 多进程造成的问题:
- 静态成员和单例模式完全失效;
- 线程同步机制完全失效;
- SharedPreferences 的可靠性下降;
- Application 会多次创建。
2. IPC 基础概念介绍
- Serializable 接口:
- 反序列化得到的对象内容完全一样,但不是同一个对象;
- serialVersionUID 用于反序列化时比较序列化后的数据中serialVersionUID 和当前类中的,只有相同时才能被正常反序列化;
- 静态成员变量属于类不属于对象,不会参与序列化;
- 用 transient 关键字标识的成员变量不参与序列化。
- Parcelable 接口:
- 举例:
public class User implements Parcelable {
public int userId;
public String userName;
public boolean isMale;
public Book book;
public User (int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
// 返回当前对象的内容描述,几乎所有情况都是0
public int describeContents () {
return 0;
}
public void writeToParcel (Parcel out, int flags) {
out.writeInt (userId);
out.writeString (userName);
// boolean 属性
out.writeInt (isMale ? 1 : 0);
// 另一个可序列化的对象
out.writeParcelable (book, 0);
}
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User> () {
public User createFromParcel (Parcel in) {
return new User (in);
}
public User[] newArray (int size) {
return new User[size];
}
};
private User (Parcel in) {
userId = in.readInt ();
userName = in.readString ();
isMale = in.readInt () == 1;
// 传递当前线程的上下文类加载器
book = in.readParcelable (Thread.currentThread ().getContextClassLoader ());
}
}
将对象序列化到存储设备中或者序列化后通过网络传输建议使用 Serializable。
Binder:
Binder 是 Android 中的一种跨进程通信方式,Binder 还可以理解为一种虚拟的物理设备,它的设备驱动是 /dev/binder ,该通信方式在 linux 中没有。
下篇再详述。