Binder 在 Android 中占有很重要的作用,这里就对 Binder 做个解析,也便于以后复习。
主要从以下几方面分析:
- Android 中的 IPC 机制
- AIDL 的使用及分析
- Binder 通信机制的分析
Android 中的 IPC 机制
Android 是基于 Linux 内核的,所以先看下 Linux 中的 IPC 机制
- 管道
- 信号
- 消息队列
- 信号灯
- 共享内存
- Socket
这个就不详细看了,以后有时间了再研究
Android 的 IPC 机制
- 通过文件共享
- Socket
- Messager
- ContentProvider
- AIDL
其中 Messager,ContentProvider,AIDL 都是基于 Binder,可以看出 Binder 的重要性,理解了 Binder 机制后感觉还是很巧妙的。
AIDL 的使用及分析
AIDL 的使用
- 创建 aidl 文件
在 aidl 文件中定义接口
12345package zy.com.uninstall.aidl;interface IMyAidlInterface {void set(int val);int get();}构建工程生成 Java 文件
编写 Service 并集成 IMyAidlInterface.Stub() 重写接口函数,在 onBind() 中返回
1234567891011121314151617181920public class MyServer extends Service {public IBinder onBind(Intent intent) {IMyAidlInterface binder = new IMyAidlInterface.Stub() {public void set(int val) throws RemoteException {}public int get() throws RemoteException {return 0;}};return null;}}使用时在 onServiceConnected() 中获取到 IMyAidlInterface,之后就可以通过 binder 调用远程方法
12345678910111213141516private void initService() throws RemoteException {ServiceConnection connection = new ServiceConnection() {public void onServiceConnected(ComponentName name, IBinder service) {binder = IMyAidlInterface.Stub.asInterface(service);}public void onServiceDisconnected(ComponentName name) {}};Intent intent = new Intent(this, MyServer.class);bindService(intent, connection, BIND_AUTO_CREATE);}
aidl 生成 java 文件的分析
创建 aidl 文件构建工程后,会自动生成下面的 java 文件
|
|
上述代码在注释中对重要的地方做了解释,整体调用流程就是 service 中实现了 Stub 中的方法,并将 Binder 对象返回给 client,如果 client 和 service 在同一个进程,就返回 Stub 本身,否则返回 Proxy 对象,client 通过 Proxy 对象调用时,最终会调用到 Stub 的 onTransact() 函数,其中用 int 值来区分不同的函数。接下来详细分析下 Binder 的调用过程。
Binder 通信机制的分析
获取系统的 service
以后在写吧
ServiceManager 自身的注册和其他 service 的注册
这里放一张图说明整个过程
Binder 通信过程
这里放一张图说明整个过程
关于 Binder 的资料
关于 Binder 的资料有很多,这里放一些个人感觉很好的连接,这些博客资料都比本文写的要好也更详细,但还要写这篇的原因是方便自己以后复习看,个人认为把流程绘制成图更好理解一些,以后有更详细的分析也会加进来。