IPC(Inter-Process Communication) 进程间通
Binder
Binder是Android中的一个类,它继承了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式,
从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。
Binder一个很重要的作用是:将客户端的请求参数通过Parcel包装后传到远程服务端,远程服务端解析数据并执行对应的操作,同时客户端线程挂起,当服务端方法执行完毕后,再将返回结果写入到另外一个Parcel中并将其通过Binder传回到客户端,客户端接收到返回数据的Parcel后,Binder会解析数据包中的内容并将原始结果返回给客户端,至此,整个Binder的工作过程就完成了。
由此可见,Binder更像一个数据通道,Parcel对象就在这个通道中跨进程传输,至于双方如何通信,这并不负责,只需要双方按照约定好的规范去打包和解包数据即可。
3.3 Binder 典型交互
- Server 将自己注册到 ServiceManager 中
- Client 通过服务名称向 ServiceManager 查找对应服务
- ServiceManager 根据服务名称查找到 Server ,在内核中建立对应的 Binder 实体,并将该实体对应的 Binder 引用返回给Client
- Client 通过 Binder 引用向 Server 发起请求
- Binder 驱动根据 Binder 引用找到对应的 Binder 实体,将客户端的请求发送给 Binder 实体处理
- Binder 驱动将处理后的结果返回给 Client
当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializeble。Serializable和Parcelable接口可以完成对象的序列化过程。还有时候我们需要把对象持久化到存储 设备上或者通过网络传输给其他客户端,这个时候也需要Serializable来完成对象的持久化。
Serializable接口
(1)Serializable是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化非常简单,只需要在类的声明中指定一个类似下面的标识即可自动实现默认的序列化过程。
Parcelable接口
(1)Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。
3、Parcelable接口和Serializable接口的比较
(1)Serializable用起来简单,但开销很大,序列化和反序列化过程都需要大量的I/O操作。
(2)Parcelable是Android中的序列化方式,更适合在Android平台上使用,用起来比较麻烦,效率很高,首选。主要用在内存序列化上。