Android ALDL那些事,一篇搞定

发布时间:2024年01月18日

1. AIDL概念

Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信.在 Android 中,一个进程通常无法访问另一个进程的内存.因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象.编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题.

跨进程通信(IPC)的方式很多,AIDL是其中一种.还有Bundle、文件共享、Messenger、ContentProvider和Socket等进程间通信的方式. AIDL是接口定义语言,只是一个工具,具体通信还是得用Binder来进行.Binder是Android独有的跨进程通信方式,只需要一次拷贝,更快速和安全.

官方推荐我们用Messenger来进行跨进程通信,但是Messenger是以串行的方式来处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端仍然只能一个个处理,如果有大量的并发请求,那么用Messenger就不太合适了.这种情况就得用AIDL了.其实Messenger的底层也是AIDL,只不过系统做了层封装,简化使用.

2. AIDL使用

2.1 大致流程

  1. 创建 .aidl 文件:此文件定义带有方法签名的编程接口.
  2. 实现接口: Android SDK 工具会基于你的 .aidl 文件,使用 Java 编程语言生成接口.此接口拥有一个名为 Stub 的内部抽象类,用于扩展 Binder 类并实现 AIDL 接口中的方法.你必须扩展 Stub 类并实现这些方法.
  3. 向客户端公开接口: 实现 Service 并重写 onBind(),从而返回 Stub 类的实现.

2.2 案例

2.2.1 定义aidl接口

AIDL支持的数据类型:

而且在AIDL文件中,不是所有数据类型都是可以使用的,支持的数据类型如下:

  • Java 编程语言中的所有原语类型(如 int、long、char、boolean 等)
  • String和CharSequence;
  • List:只支持ArrayList,里面每个元素都必须能够被AIDL支持;
  • Map:只支持HashMap,里面的每个元素都必须被AIDL支持,包括key和value;
  • Parcelable:所有实现了Parcelable接口的对象;
  • AIDL:所有的AIDL接口本身也可以在AIDL文件中使用.

注意: - 当需要传递对象时,则对象必须实现Parcelable接口 - 所有非原语参数均需要指示数据走向的方向标记.这类标记可以是 in、out 或 inout. - in : 客户端流向服务端 - out : 服务端流向客户端 - inout : 双向流通 - 原语默认是in,这里应该考虑一下是用什么原语标记,因为如果是inout的话开销其实蛮大的.

2.2.2 写一个Service,用于绑定

2.2.3在AndroidMainifest中注册

3客户端Service

3.1.1将aldl文件整个复制到客户端

3.1.2在客户端绑定service

4 测试成功?

4.1.1先启用服务端服务,在启动客户端服务

文章来源:https://blog.csdn.net/2301_77184740/article/details/135666886
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。