这篇文章用通俗易懂的方式讲解了 Android 中跨进程通信的关键技术 AIDL 的四个重要概念(in/out/inout/oneway),我们可以用快递收发包裹的比喻来理解:
一、数据流向标签(快递方向)
-
in 标签(单向寄出)
- 相当于你寄快递给朋友,包裹里的东西完全由你决定
- 朋友收到的是完整的包裹,但朋友对包裹的修改不会同步给你
- 适用场景:上传数据(如提交订单信息)
-
out 标签(单向收回)
- 相当于你给朋友寄一个空箱子
- 朋友往箱子里放入礼物,快递员再把箱子带回给你
- 示例:
void getUserInfo(out User user)
客户端调用时 user 是空对象,服务端会创建新对象并填充数据
-
inout 标签(双向传输)
- 相当于你寄出一个装有资料的文件夹
- 朋友在资料上做批注,再将文件夹寄回给你
- 典型场景:需要双向修改数据(如游戏角色状态同步)
二、异步通信标识(快递方式)
oneway 关键字(加急快递)
- 相当于你发短信告诉朋友一件事,发完就继续做自己的事情
- 特点:
① 方法没有返回值(void)
② 服务端不会阻塞客户端
③ 不能保证执行顺序 - 适用场景:日志上报、非关键性状态更新
三、技术实现原理
通过分析生成的 Java/C++ 代码,可以发现:
- in 的实现
客户端调用时会将对象数据写入 Parcel(Android 专用的数据容器),服务端读取后生成新对象 - out 的玄机
客户端传入空对象,服务端创建新对象并写入返回的 Parcel,客户端读取后更新原对象 - inout 的双向流动
客户端写入初始数据 -> 服务端修改 -> 客户端读取修改后的数据 - oneway 的异步本质
通过 FLAG_ONEWAY 标识告诉系统不需要等待回复,就像寄平信不需要签收回执
四、使用注意事项
- 默认不写标签时等同于 in
- 使用 out 时客户端对象初始内容不会被服务端读取
- oneway 方法不能用于需要获取返回值的场景
- 跨进程对象需要实现 Parcelable 接口(就像包裹必须符合快递包装规范)
通过理解这些关键字的运作机制,可以更高效地设计 Android 的跨进程服务,就像掌握不同快递服务的特性后,能更合理地安排重要文件和各种物品的传递方式。