为了更好的学习IPC跨进程通讯技术,介绍一些相关概念。
- 序列化原因:
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 通过序列化对象在网络中传递对象;
- 通过序列化在进程间传递对象。
Serializable接口
- 是Java提供的一个序列化空接口,使用相当方便,只需实现这个接口并且指定private static final long serialVersionUID = 1L的数值,如果不指定的话反序列化会受到影响。因为序列化的时候系统会把serialVersionUID写入序列化文件的(也可能是其他介质);反序列化的时候会检测这个值 ,不一样的话就会反序列化失败。
- 静态变量不属于类的内容,不参与序列化、反序列化
- transient标示的关键字不参与反序列化和序列化。序列化和反序列化之后对象内容一样,但是并不是一个对象。
- 如果类结构发生毁灭性的变化,反序列化会失败,比如说成员变量类型发生变化,修改了类名等(新增加或减少了成员变量由于serialVersionUID 的存在会反序列化成功)。
序列化过程
Book book = new Book("张三",21); ObjectOutputStream os = null; try { os = new ObjectOutputStream(new FileOutputStream("cache.txt")); os.writeObject(book); } catch (IOException e) { e.printStackTrace(); }finally { try { if (os!=null) os.close(); } catch (IOException e) { e.printStackTrace(); } }
反序列化过程
ObjectInputStream is = null; try { is = new ObjectInputStream(new FileInputStream("cache.txt")); book= (Book) is.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (is!=null) is.close(); } catch (IOException e) { e.printStackTrace(); } }
Parcelable接口
- 实现这个接口,就能实现序列化,通过Intent和Binder传递
- serializable和parcelable的区别
- 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
- Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
- Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
Binder类(IBinder的实现类)
- 理解为一种虚拟的物理设备,设备驱动是/dev/binder
- 从Applications层来讲,Binder是客户端和服务端(不是我们理解的那个Http请求的服务器端,是指IPC的时候a进程访问b进程中的东西,这时候b进程就是服务端)进行通信的媒介。当bindeService的时候返回一个Binder对象,客户端就会得到服务端提供的服务(普通的服务和AIDL服务)和数据。
- 从Framework层面来讲,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager…)和相应ManagerService层的桥梁。
Binder在Android开发中主要应用于Service中,包括AIDL和Messenger。普通Service的Binder不涉及IPC进程间通信,比较简单。Messenger的底层其实就是AIDL,所以这里我们利用AIDL来分析Binder机制。需要明确的是AIDL只是一个为了快速实现binder的产物,而不是一个必需品。