AIDL 接口中的 in、out、inout、oneway 关键字
/ 1. in + oneway:异步传递输入参数(调用方发指令,不等待结果)// 2. out + 同步:同步获取服务端输出结果(调用方等待服务端填充数据)// 3. inout + 同步:同步双向交互(调用方传初始配置,服务端更新后返回)
·
在 Android AIDL(Android Interface Definition Language,安卓接口定义语言)中,in
、out
、oneway
是用于定义跨进程通信(IPC)接口时,控制参数传递方向和调用方式的关键字,核心用法如下:
1. 核心关键字:in / out / inout(控制参数传递方向)
AIDL 中参数默认不允许跨进程传递,必须显式声明传递方向,明确数据是“从调用方传给服务端”“从服务端回传给调用方”,还是“双向传递”。
关键字 | 传递方向 | 核心作用 | 适用场景 |
---|---|---|---|
in | 单向(调用方 → 服务端) | 服务端仅读取参数值,不修改;即使修改,调用方也无法获取到修改后的数据。 | 传递“输入型数据”(如请求参数:用户名、查询条件)。 例: void login(in String username) |
out | 单向(服务端 → 调用方) | 调用方传递的参数“初始值无效”,服务端会修改该参数的值,最终调用方能获取到服务端的修改结果。 | 传递“输出型数据”(如需要服务端填充的结果:用户信息、计算结果)。 例: void getUserInfo(out User user) |
inout | 双向(调用方 ↔ 服务端) | 调用方传递初始值,服务端可读取并修改,最终调用方能获取到服务端的修改结果(兼顾 in 和 out 的功能)。 | 传递“双向交互数据”(如需要服务端更新的配置信息)。 例: void updateConfig(inout Config config) |
2. 关键字:oneway(控制调用方式为“异步非阻塞”)
oneway
是修饰 AIDL 方法的关键字,用于改变跨进程调用的“同步/异步”特性,仅影响方法调用的阻塞行为,不影响参数传递方向(参数仍需配合 in/out/inout 使用)。
核心特点:
- 默认调用方式:AIDL 方法默认是“同步阻塞”——调用方会一直等待服务端执行完方法并返回结果(或抛出异常),才会继续执行后续代码。
- oneway 调用方式:调用方调用方法后,会“立即返回”,不等待服务端执行结果(非阻塞);服务端会在后台异步处理该请求。
限制与适用场景:
- 强制无返回值:被
oneway
修饰的方法,返回值必须是void
(因为调用方不等待结果,返回值无意义)。 - 适用场景:传递“无需等待结果的指令”(如发送通知、触发日志记录、控制UI刷新)。
例:oneway void sendNotification(in String content)
总结:常见组合示例
// 1. in + oneway:异步传递输入参数(调用方发指令,不等待结果)
oneway void startDownload(in String url);
// 2. out + 同步:同步获取服务端输出结果(调用方等待服务端填充数据)
void getDownloadProgress(out Progress progress);
// 3. inout + 同步:同步双向交互(调用方传初始配置,服务端更新后返回)
void syncSettings(inout AppSettings settings);
更多推荐
所有评论(0)