重温Android开发艺术探索之二 Android的跨进程通信

227 阅读3分钟

重温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 提供数据给其他进程使用。