在 Android AIDL(Android Interface Definition Language,安卓接口定义语言)中,inoutoneway 是用于定义跨进程通信(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);
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐