一、请回答一下Android进程间的通信方式?
二、谈谈 AIDL?
1、定义 AIDL 是 android Interface Dialog Launguage , 是一个android 接口 对话语言,
2、作用是 为了实现进程间之间服务的通信。
3、实现方式, Service Client 和 Service Service 同时 持有一个 AIDL文件,编译的时候, 会自动变成一个可以引用的Binder子类。 Client 绑定服务成功后, 获取这个子类,可以使用里面的方法。 Service 在 onBind 方法里面 返回 这个Binder 类。
4、内部实现原理 是Binder ,实现了进程之间的通信。
三、谈谈你对 Binder 的理解
性能
- socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。
- 消息队列和管道采用 存储-转发 方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。
- 共享内存虽然无需拷贝,但控制复杂,难以使用。
- Binder 基于 Client-Server 通信模式,传输过程只需一次拷贝,性能较好,效率虽然比共享内存的零次要低,但比管道和 socket 的两次要高。
安全性
Binder 的 Client-Server 通信模式,为发送方添加 UID/PID 身份,既支持 实名Binder 也支持 匿名Binder ,保证了跨进程通讯的安全。
Binder 通信流程
- Service 在 ServiceManager 中注册
- Client 想要调用 Service 的方法,需要先获取 Service 对象, ServiceManager 会返回给它一个代理对象,即 Proxy
-
Client
调用Proxy
的方法,ServiceManager
会帮它调用Service
对应的方法,并把结果返给它。
Android 中使用 Binder 的场景
ActivityManagerService 、 PackageManagerService 、 WindowManagerService 等 XXXManagerService 形式的基本都会用到,一般会在 SystemService 来注册这些系统服务。
其它的如 NotificationCompatSideChannelService 、 ContentProviderNative 等等,都有引用到。