重温Android开发艺术探索之二 Android的跨进程通信
开启多进程
-
四大组件指定 android:process 属性。
-
通过JNI在native层去fork一个新的进程,基本不会用到。
以 ‘ :’冒号命名的进程属于当前应用的私有进程,其他应用不能和他跑在同一进程中,而不以冒号开头的进程属于全局进程,其他应用可以通过ShareUID方式可以和它跑在同一进程中。
序列化与反序列化
-
Serializable 接口 效率较低
-
Parcelable 接口 效率好,实现稍微麻烦一点
Binder
Binder是Android中的一个类,实现了IBinder接口,是Android特有的IPC方式,Binder还可以理解为一种虚拟的物理设备,他的驱动是/dev/binder.Binder是FrameWork层ServiceManager连接各种Manager的桥梁。Binder是客户端和服务端的通信媒介,当bindServie时,服务端会返回一个包含了服务端业务的Binder对象。客户端通过这个对象获取服务端的业务。
AIDL
声明一个AIDL性质的接口只需要继承IInterface接口即可,实现抽象Stub类和Stub类中的Proxy代理类,Stub类继承至Binder,实现我们的AIDL接口,一般我们都是直接新建一个aidl文件,as自动给我们生成相关代码。
使用AIDL的流程就是创建一个Service 和一个 AIDL接口,接着创建一个类继承至AIDL接口中的Stub类并实现里面的方法(这个类的对象就是Binder对象),在Service的onBinder方法中返回这个类的对象,然后客户端就可以绑定服务的Service,建立连接后就可以访问服务端的方法了。
Bindre 连接池
所谓binder连接池,其核心也是一个Binder对象,通过不同的标识,返回不同的Binder对象给客户端,绑定service的就是这个Binder对象。客户端拿到各自的Binder对象后,转换成各自的接口调用各自的方法。此时这个binder对象运行在Service中,从而达到Service复用的效果。
Android中的IPC方式
-
Bundle Intent中的传值就靠它了。
-
文件共享 不同的进程通过读写同一文件来进行数据交换,很显然只能做一些简单的通信操作,对于数据同步要求高的操作不适合。
-
Messenger 底层就是AIDL
-
AIDL 实际上就是Binder,AIDL只是自动帮我们生成了用Binder实现进程通讯的必要代码。
-
支持基本数据类型,String CharSequence List Map Parcelable AIDL
-
RemoteCallbackList 系统专门提供用于删除挂进程listener的接口。
-
客户端调用服务的方法,服务端的方法运行在Binder的线程池中,同时客户端会被挂机,所以应该在子线程中调用服务端的方法,同理服务端调用客户端时也是需要在子线程中调用。
-
-
ContentProvider ContentProvider看起来像一个数据库,实际上是以表格的形式来组织数据,并且可以包含多个表。
-
Socket 套接字,分为流失套接字和用户数据报套接字两种,对应TCP 和UDP协议。
选择合适的IPC方式
-
四大组件用Bundle
-
没有并发读写的,简单的用可以用文件共享
-
一般做业务都用AIDL
-
ContentProvider 提供数据给其他进程使用。