Android跨进程通信:通过Intent来传递数据,共享文件和SharedPreference,基于Binder的Messenger和AIDL以及Socket。
IPC基础概念介绍:
1、Serializable接口:Serializable是java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。
User类:
public class User {
private static final long serialVersionUID = 519067123721295773L;
public int userId;
public String userName;
public boolean isMale;
public User(int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
}
序列化过程:
User user = new User(0, "jake", true);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
反列化过程:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
User newUser = (User)in.readObject();
in.close();
只要把实现了Serializable接口的User对象写到文件中就可以快速恢复了,恢复后的对象newUser和user内容完全一样,但是两者并不是一个对象。如果之前没有指定serializableUID也是可以实现序列化,但是不能保证类的内容、成员变量是否一样。所以最好需要指定一个,可以手动指定。也可以重写系统默认的序列化过程。
2、Parcelable接口:Android提供的序列化接口。
public class UserProcelable implements Parcelable {
public int userId;
public String userName;
public boolean isMale;
public Book book;
public UserProcelable(int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(userId);
out.writeSerializable(userName);
out.writeInt(isMale ? 1 : 0);
out.writeParcelable(book, 0);
}
public static final Parcelable.Creator<UserProcelable> CREATOR = new Parcelable.Creator<UserProcelable>() {
public UserProcelable createFromParcel(Parcel in) {
return new UserProcelable(in);
}
public UserProcelable[] newArray(int size) {
return new UserProcelable[size];
}
};
private UserProcelable(Parcel in) {
userId = in.readInt();
userName = in.readString();
isMale = in.readInt() == 1;
book = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
}
在上面代码中,Parcel内部包装了可序列化的数据,可以在Binder中自由传输。
在序列化过程也能够中需要实现的功能有序列化、反序列化和内容描述。
序列化由writeToParcel方法完成,最终通过Parcel中的方法完成。
反序列化由CREATOR来完成,其内部标明了如何创建序列化对象和数组,也是通过Parcel中的方法完成反序列化。
内容描述由describeContents方法完成,基本上都返回0。
其中Book是另外一个可序列化对象。
上述两种方法的区别:
Serializable是java中的接口,需要大量的IO操作,实现简单。
Paracel是Android中的接口,实现麻烦,但是效率高。
如果要涉及到将信息序列化后存储到硬盘或者通过网络传输,还是推荐使用Serializable,否则一般情况下推荐使用Paracel
网友评论