Android进程通信方案
2019-03-11 本文已影响0人
gczxbb
进程通信方式
在AndroidManifest文件指定组件的android:process属性,让该组件运行在不同的进程。进程间通信的方案总结一下,有如下几种。
- ContentProvider组件,(基于Binder),为其他App进程数据统一的访问接口,常用在数据共享方面,对数据源crud操作。
-
Aidl,(基于Binder),一对多的并发通信方案,定义一组服务端进程暴露的业务接口下载aidl文件,在打包编译期间,首先利用aidl工具处理成java类。当aidl工具处理后,生成的Stub抽象类,该类继承Binder类,implement业务接口,未实现方法。具体实现交给服务进程。
在服务端进程,实现Stub类业务方法,在onBinder方法中,将其作为真正的Binder对象返回。
在客户端进程,onSericeConnected方法,收到IBinder对象是BinderProxy代理类,在Stub类中,有一个asInterface静态方法,它的功能是将BinderProxy代理转换成业务代理,返回Stub.Proxy对象,该对象封装了BinderProxy对象。Stub.Proxy类是Stub内部类,实现业务方法,在业务方法中,利用BinderProxy发送数据和服务进程通信。
注意一下,如果Servie和请求组件配置在同一进程,那么onSericeConnected方法返回的就不是BinderProxy对象啦,而是服务端定义的实现Stub类的真正对象,该对象是继承Binder的噢,也就是说返回的不是Binder代理,而是Binder!
-
Bundle/Intent,在配置成其他进程的四大组件间传递数据。传递Bundle支持的数据类型,数据可以是实现Serializable或Parcellable接口的结构,在不同进程组件间通信。
-
文件共享,对同一个文件先后写读,从而实现传输,无法实现高并发,简单的交换数据场景。
-
Messenger,基于AIDL实现的。
-
Socket,连接应用层和传输层接口,网络传输字节流的通信,支持1对多并发实时通信,无RPC。
什么是RPC
远程过程调用,当调用一个远程服务后,自己进入等待,传递到服务端的参数,当收到调用时,服务端进程取得参数,计算结果,返回参数包括执行结果。服务端可以创建线程处理事务。
Binder为Android的RPC机制提供底层支持,利用底层Binder通信的方案,实现在客户端调用远程服务进程的方法,其他的IPC方式不支持函数调用功能,没有RPC,仅仅是数据流传递。因此,Android系统RPC本质上是底层Binder提供的进程间通信方案和上层建立的进程间函数调用机制共同实现的。
Android应用进程通信场景
音乐播放类,后台统计类,如计步,手机管家类。
任重而道远