2. AIDL 语法与接口设计
AIDL(Android Interface Definition Language)是 Binder 通信的接口契约语言。本章深入拆解 AIDL 的接口定义关键字、数据类型映射规则、导包规范以及 in/out/inout 方向标记的底层语义,帮助你在设计跨进程接口时写出高效、类型安全的 .aidl 文件。
2.1 接口定义关键字
AIDL 接口使用以下三个核心关键字构建方法签名和调用行为:
| 关键字 | 位置 | 语义 | 示例 |
|---|---|---|---|
| interface | 文件顶级 | 声明一个 AIDL 接口,Binder 通信的契约入口 | interface IWeatherService { ... } |
| oneway | 方法修饰符 | 异步调用,不等待服务端返回;服务端收到后立即返回,客户端不阻塞 | oneway void shutdown(); |
| in / out / inout | 参数方向标记 | 指示参数在 Binder 传输中的流动方向 | in String cityCode |
🔴 重要约束:
oneway 方法不能有返回值,且参数只能使用 in 方向(不允许 out / inout)。服务端即使返回数据,客户端也无法接收。
下面是一个完整的 AIDL 接口定义,综合展示了上述关键字和方向标记的用法:
// IWeatherService.aidl
package com.example.weather;
import com.example.weather.WeatherData;
interface IWeatherService {
/** 查询天气 — in 方向:客户端传入城市码 */
WeatherData getCurrentWeather(in String cityCode);
/** 上报天气 — out 方向:服务端填充数据返回给客户端 */
void reportWeather(out WeatherData data);
/** 更新天气 — inout 方向:双向传递 */
boolean updateWeatherData(inout WeatherData data);
/** 异步关闭服务 — oneway,无返回值 */
oneway void shutdown();
}