课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
1.AIDL 介绍
在 Android 中每一个进程都有自己的 VM 实例,都有一块属于自己的独立内存。Binder 就是 Android 中一种跨进程通信方式,Binder 通信采用 c/s 结构,Binder 组件通常包括 Client、Server、ServiceManager 以及 Binder 驱动。具体的通信过程是:
- 首先 Server 向 ServiceManager 注册一个服务;
- Client 从 ServiceManager 获取服务,这样 Client 就可以与 Server 进行通信。
- 真正的数据流是通过底层的 Binder 驱动来实现,这是被系统封装好的。
AIDL 就是应用在 Android 中进程间通信的一种语言,通过 AIDL 可以在一个进程中获取另一个进程的数据和对外提供的方法。AIDL 的本质是帮我们简化了进程间通信的开发工作,它的核心还是 Binder 机制。
2.如何创建 AIDL
通过 AIDL 实现进程间通信,通常包括以下几个步骤:
- 创建 AIDL 实体对象(实现 Parcelable 接口),为了跨进程通信时传递数据使用,在 main 目录下创建独立的 aidl 文件夹,aidl 文件的包名要和对应 java 类的包名完全一致。
- 在服务端创建 aidl 实例,将服务端的接口包装进去,创建 binder 对象,通过 onBind()方法提供给客户端;
- 客户端实现 ServiceConnection,在方法中获取到 aidl 的实例,通过 bindService() 获取到 aidl 实例,从而调用服务端的方法。
3.分析 AIDL 生成的 java 文件
ADIL 文件帮我们生成了 binder 对象,同时生成了跨平台转换类 stub ,以及在不同进程时客户端拿到的代码 proxy 。服务端创建 aidl 的 stub 的实体,stub 既是 binder 也是 IInterface,实现接口中的方法,在onBind中返回给客户端。
整个文件的核心就是静态内部抽象类 stub。stub中包含了一下几项内容:
- asInterface() 用来根据不同进程返回 stub 类自己还是 proxy 代理类,如果是在同一进程,就返回 stub 类,如果不在同一进程,就会创建 proxy 代理。
- 代理类 proxy 用来向远程进程包装数据、发送数据、解析返回结果。
- onTransact() 方法作为服务端进程调用,用来处理客户端进程传递过来的数据。
- IInterface 接口的功能方法,stub 继承了接口,这些方法用来处理客户端进程的具体业务。
课程收获
这一节详细介绍了 AIDL 的创建和使用,从应用层面看使用 AIDL 解决了进程间的通信问题,其核心是 Binder 机制,从 Framework 层来看 Binder 又是链接各种 Manager 和 ManagerService 的桥梁。