IPC指的是跨进程通信,本文主要分为三个方面来介绍IPC(本人学习的心得),第一,是两种序列化方式,第二,是Binder的简单介绍和使用,第三就是AIDL的使用和原理
下面开始,首先,两种序列化的方式,第一是Java中常用的Serializable接口,这本身是一个空接口,使用起来相当简单,下面是一个示例
public class User implements Serializable{
private static final long serialVersionUID = 1L;
int Id;
String name;
public User(int id,String name){
this.Id = id;
this.name = name;
}
}
这就是一个实现了该接口的类,就可以被序列化和反序列化了
如下
public void xuLieHua(){
User user = new User(1,"nkpdqz");
try {
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("123.txt"));
outputStream.writeObject(user);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void fanXuLieHua() {
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("123.txt"));
User user = (User) inputStream.readObject();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
在这里,这个UID是为了辅助序列化和反序列化过程的,它的作用比较类似一把钥匙,在序列化的时候写入序列化的文件中,反序列化的时候系统会检测文件中的UID,一致的话才会正常地反序列化,否则会报错
PS:UID本身是一个静态成员变量,不会参与序列化过程。
到这里,Serializable这个接口就完了,确实不是特别难,但是比较不幸的是,这个是Java的序列化接口,使用起来系统开销比较大,所以安卓特意有一套Parcelable接口,这个接口使用起来会稍微麻烦一点,但是效率很高,下面就说一说这个接口
首先,还是一个实现了这个接口的类,如下:
public class User2 implements Parcelable{
int Id;
String name;
public User2(int id,String name){
this.Id = id;
this.name = name;
}
private User2(Parcel in) {
Id = in.readInt();
name = in.readString();
}
public static final Creator<User2> CREATOR = new Creator<User2>() {
@Override
public User2 createFromParcel(Parcel in) {
return new User2(in);
}
@Override
public User2[] newArray(int size) {
return new User2[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(Id);
dest.writeString(name);
}
}
此外,如果在这个类里面还实例化了一个其他实现了Parcelable的类的对象的话,在反序列化的时候要传递当前线程的上下文类加载器。在这里不细说。