IPC机制——多进程以及基础概念
一、多进程模式
通过process属性指定进程名来实现启动时运行在新进程的效果,此时相当于两个应用采用了SharedUID的模式。
由于在Android中会为每一个进程分配一个独立的虚拟机,即此时内存不同享,sharedPreferences由于并发读写的问题也变得不可靠(其底层实现为读/写XML文件)。
二、基础概念
主要介绍三个内容——实现对象序列化的两个接口(serializable和parcleable接口)以及Binder。
1、Serializable接口
由Java提供的一个序列化接口,实现非常简单只需实现该接口即可,无需复写方法。序列化以及反序列化过程如下
//序列化 User user = new User(1,2); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(XX.txt)); out.writeObject(user); out.close(); //反序列化 ObjectInputStream in = new ObjectInputStream(new FileInputStream(XX.txt); in.readObject(user); in.close(); //user为序列化对象
注意序列化前后的两个对象虽然内容相同但不是同一对象。
静态成员变量属于类不属于对象,不参加序列化。用transient修饰的成员变量也不参加序列化。
序列化以及反序列化方法可复写实现自定义序列化以及反序列逻辑,但逻辑较复杂。
2、Parcelable接口
另一种序列化接口,实现较复杂需复写多个方法实现序列化以及反序列化。但相对与serialzable接口默认将对象全部序列化,使用该接口效率优势明显,故一般采用该接口。
代码如下:
public class Book implements Parcelable { public int bookId; public String bookName; public Book(int bookId,String bookName){ this.bookName = bookName; this.bookId = bookId; } //一般返回0,只在文件由文件修饰符时返回1 @Override public int describeContents() { return 0; } //序列化过程,调用write方法实现 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(bookId); dest.writeString(bookName); } //反序列化过程,内部表明如何创建序列化对象和数组 public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { //返回序列化对象 @Override public Book createFromParcel(Parcel source) { return new Book(source); } //返回序列化对象数值 @Override public Book[] newArray(int size) { return new Book[size]; } }; //调用read方法 private Book(Parcel source){ bookId = source.readInt(); bookName = source.readString(); //当序列化对象中存在另一序列化对象需传送上下文加载器 //如:user = source.readParcelable(Thread.cureentThread().getContextClassLoader()); } }
在将对象序列化到存储设备中或者将对象序列化后通过网络传输由于Pacelable实现较为复杂,建议使用Serializable接口。
3、Binder(暂略)
这只是个做笔记的地方
浙公网安备 33010602011771号