IPC(Inter-Process Communication,进程间通信)指两进程间进行数据交换的过程。
IPC 并不是 Android 独有的,Windows 上可通过剪切板、管道和油槽等来进行进程间通信;Linux 可通过命名管道、共享内存和信号量等实现进程间通信。
虽然 Android 是基于 Linux 内核的操作系统,但是它有自己的进程间通信方式。
在 Android 中,通过 Binder 可以实现进程间通信,还有 Socket 、ContentProvider 等等。
IPC 使用场景,一是应用的自身原因需要使用多进程实现;另一个是通过多进程获得更多内存空间。
我们需要通过 Intent 和 Binder 传输数据时,需要用到 Serializable 或者 Parcelable 接口完成对象的序列化。
1、Serializable 接口
Serializable 是 Java 提供的一个序列化接口,是一个空接口。
public class User implements Serializable {
private static final long serialVersionUID = 8929979969779835719L;
public int userId; public String userName; public boolean isMale; ··· }
|
只需实现 Serializable 接口,一般应该手动指定 serialVersionUID ,当版本升级时能最大限度恢复数据。
User user = new User(0, "wshunli", true); try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.text")); out.writeObject(user); out.close(); } catch (IOException e) { e.printStackTrace(); }
try { ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.text")); User newUser = (User) in.readObject(); Log.d(TAG, "onCreate: " + newUser.toString()); in.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
|
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
2、Parcelable 接口
Parcelable 接口是 Android 系统提供的序列化接口。
public class User implements Parcelable {
public int userId; public String userName; public boolean isMale;
public Book book;
public User(int userId, String userName, boolean isMale, Book book) { this.userId = userId; this.userName = userName; this.isMale = isMale; this.book = book; }
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(userId); dest.writeString(userName); dest.writeInt(isMale ? 1 : 0);
dest.writeParcelable(book, 0); }
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>(){
@Override public User createFromParcel(Parcel source) { return new User(source); }
@Override public User[] newArray(int size) { return new User[size]; } }; private User(Parcel source) { userId = source.readInt(); userName = source.readString(); isMale = source.readInt() == 1;
book = source.readParcelable(Thread.currentThread().getContextClassLoader()); } }
|
使用 Parcelable 序列化还是有点麻烦的,不过思路清晰。
Serializable 和 Parcelable 比较:
Serializable 是 Java 的序列化接口,需要大量 I/O 操作,开销比较大;
Parcelable 是 Android 中的序列化接口,效率更高,因此首选。
但是在将对象序列化到存储设备或者将对象序列化后的通过网络传输,建议使用 Serializable 接口。
参考资料
1、《Android开发艺术探索》 – 2.1 Android IPC 简介、2.3 IPC 基础概念介绍
2、Android IPC机制详解(一) - 简书
https://www.jianshu.com/p/b9b3051a4ff6
3、Android 中的IPC机制 - CSDN博客
https://blog.csdn.net/a565102223/article/details/70186070
4、Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释 - CSDN博客
https://blog.csdn.net/qq_27093465/article/details/78544505
5、详细介绍Android中Parcelable的原理和使用方法 - CSDN博客
https://blog.csdn.net/justin_1107/article/details/72903006