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