Android 中跨进程通信的关键技术 AIDL 的四个重要概念(in/out/inout/oneway)

318 阅读2分钟

这篇文章用通俗易懂的方式讲解了 Android 中跨进程通信的关键技术 AIDL 的四个重要概念(in/out/inout/oneway),我们可以用快递收发包裹的比喻来理解:


一、数据流向标签(快递方向)

  1. ​in 标签(单向寄出)​

    • 相当于你寄快递给朋友,包裹里的东西完全由你决定
    • 朋友收到的是完整的包裹,但朋友对包裹的修改不会同步给你
    • 适用场景:上传数据(如提交订单信息)
  2. ​out 标签(单向收回)​

    • 相当于你给朋友寄一个空箱子
    • 朋友往箱子里放入礼物,快递员再把箱子带回给你
    • 示例void getUserInfo(out User user)
      客户端调用时 user 是空对象,服务端会创建新对象并填充数据
  3. ​inout 标签(双向传输)​

    • 相当于你寄出一个装有资料的文件夹
    • 朋友在资料上做批注,再将文件夹寄回给你
    • 典型场景:需要双向修改数据(如游戏角色状态同步)

二、异步通信标识(快递方式)

​oneway 关键字(加急快递)​

  • 相当于你发短信告诉朋友一件事,发完就继续做自己的事情
  • 特点:
    ① 方法没有返回值(void)
    ② 服务端不会阻塞客户端
    ③ 不能保证执行顺序
  • 适用场景:日志上报、非关键性状态更新

三、技术实现原理

通过分析生成的 Java/C++ 代码,可以发现:

  1. ​in 的实现​
    客户端调用时会将对象数据写入 Parcel(Android 专用的数据容器),服务端读取后生成新对象
  2. ​out 的玄机​
    客户端传入空对象,服务端创建新对象并写入返回的 Parcel,客户端读取后更新原对象
  3. ​inout 的双向流动​
    客户端写入初始数据 -> 服务端修改 -> 客户端读取修改后的数据
  4. ​oneway 的异步本质​
    通过 FLAG_ONEWAY 标识告诉系统不需要等待回复,就像寄平信不需要签收回执

四、使用注意事项

  1. 默认不写标签时等同于 in
  2. 使用 out 时客户端对象初始内容不会被服务端读取
  3. oneway 方法不能用于需要获取返回值的场景
  4. 跨进程对象需要实现 Parcelable 接口(就像包裹必须符合快递包装规范)

通过理解这些关键字的运作机制,可以更高效地设计 Android 的跨进程服务,就像掌握不同快递服务的特性后,能更合理地安排重要文件和各种物品的传递方式。