Binder是什么?
在开始介绍AIDL之前,我们必须对Binder有一个初步的了解。
Binder就是Android用来跨进程通信的一种方式,这个涉及的知识点太多,我会单独开一篇讲述。
在这里,我们需要知道的是,既然涉及到跨进程通讯,就肯定会有两个不同的进程,以及一条连接两个进程的通道。
这两个进程中,提供服务的进程我们把它叫做服务端,享受服务的进程我们把它叫做客户端,连接服务端和客户端的通道有很多,binder就是其中之一。
AIDL是什么?
Android Interface Definition Language,即Android接口定义语言
可以理解为用来生成binder通信代码的脚本语言
AIDL该怎么用?
我会选用Android的Doze服务来分析AIDL的使用步骤。
涉及到的文件有以下三个:
- 服务端:DeviceIdleController.java
- 客户端:DeviceIdleManager.java
- 通道(Binder):IDeviceIdleController.aidl、ServiceManager.java
如果把客户端比作一个想吃饭的人,服务端比作一家提供很多菜品餐厅,那么AIDL就是餐厅中的菜单,ServiceManager就是指向各个餐厅的地图
一、通道(Binder)
我们看下IDeviceIdleController.aidl的具体代码实现
package android.os;
import android.os.IMaintenanceActivityListener;
import android.os.UserHandle;
/** @hide */
interface IDeviceIdleController {
void addPowerSaveWhitelistApp(String name);
...
void addPowerSaveTempWhitelistApp(String name, long duration, int userId, String reason);
}
这就是一个AIDL的标准写法,看起来就是这么枯燥无味且平淡,主要组成部分就是在interface中定义所有服务端向外提供的接口,就像是一家餐厅提供的菜单。
相信有些细心的同学,就会有些疑问,服务端的接口通过AIDL抛出来了,但是客户端怎么找到服务端呢?
这就涉及到Binder的核心实现ServiceManager,在本篇中不多介绍,后续会单开一章。
二、服务端
服务端作为服务的提供者,就像是一家餐厅,菜单上写出来的菜,硬着头皮也得烧出来。