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的类的对象的话,在反序列化的时候要传递当前线程的上下文类加载器。在这里不细说。