总结梳理顺序:IPC简介、android多进程模式、Serializable、Parcelable、binder、IPC方式、binde连接池。
1.IPC简介:进程间通讯。
2.android多进程模式:指定android:process开启多进程方式。
①.多进程运行机制:会为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上会有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生不同的副本。
②.产生的问题:
(1)静态成员和单例模式完全失效。(原因:同上)
(2)线程同步机制完全失效。(不同的对象所以同步锁失效)
(3)SharedPreferences的可靠性降低。(并发写会出现问题)
(4)Application会创建多个。(不同进程会有独立的虚拟机、Application以及内存空间)
3.IPC基础概念:序列化、Serializable、Parcelable、binder。
①.序列化:对象的状态信息转换为可以存储或传输的形式的过程。
②.Serializable:java提供的序列化方式。
(1)实现:类继承Serializable接口,添加常量serialVersionUID,此类就可以进行序列化和反序列化操作了。
(2)过程:通过反射,在流的过程中产生大量的临时对象,因此造成了大量的GC。
(3)serialVersionUID是反序列化过程中需要匹配的值,所以需要给此赋值。
③.Parcelable:android提供的序列化方式。
(1)实现:类继承Parcelable接口,并实现序列化、反序列化、内容描述的过程。过程较为复杂。
(2)优点:效率高。
总结:Parcelable效率高,在内存序列化上推荐Parcelable;Serializable实现较为简单,在序列化到存储设备和网络传输 中推荐使用Serializable。
④.binder:binder是Android的一个类,他实现了IBinder接口,从IPC角度来说,Binder是Android跨进程通讯的方式。
(1)原理是基于binder的跨进程通讯方式:AIDL、Messenger、ContentProvider。
(2)源码解析可得流程图:
(3)当服务端因为某些原因异常终止了,导致binder连接断裂,这时候可以用linkToDeath方法和UnLinkToDeath方法监听
binder是否连接异常。
4.android中的IPC方式
(1)使用Bundle。
(2)使用文件共享。
(3)使用网络传输。
(4)使用Messenger:本质是binder
服务端流程:创建Handler并通过它创建Messenger对象,然后在Service的onBinder中返回这个messenger底层的 binder即可。
客户端流程:首先客户端绑定服务端的Service,然后返回IBinder对象创建Messenger,通过Messenger可以向服务端 发送消息,如果需要服务端向客户端发送消息可以通过replyTo这个参数将客户端的Messenger发送给服 务端,这样服务端可以通过此Messenger发送消息给客户端。
(5)使用AIDL:本质是binder
注意事项:
①.传递的只支持方法。
②.客户端和服务端不在一个应用需要将AIDL文件客户端和服务端各有一份,并且AIDL的包结构服务端和客户端要 保持一致,否则反序列化就无法完成,程序也不能正常运行。
③.AIDL的方法是在服务端的线程池中执行的,要注意多客户端并发读写操作。(可以用CopyOnWriteArrayList和 ConcurrentHashMap支持并发读写)。还要注意客户端调用的方法会耗时,所以一般不要在主线程中调用。
④.给服务端添加观察者模式传统方式对象是不同的,所以不能用传统模式。虽然对象不同但是对象的binder是相同 的,所以可以用RemoteCallbackList这个方法。
⑤.Binder异常断开可以在DeathRecipient中重连,也可以在onServiceDisConnected中重新连接。
(6)使用ContentProvider:本质是binder
最后是几种IPC方式的对比图:
RPC:远程过程调用。