- 《Android Service基础》
- 《Android Service回调和配置》
- 《Android Service aidl使用及进阶》
- 《Android Service更多知识》
- 《Android 中的 IntentService 类详解》
- 《Android Service aidl分析》
- 《Android Service 流程分析》
AIDL:Android 接口定义语言,可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 使用 AIDL 为简化此问题。
注意: 只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,才有必要使用 AIDL。如果无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果想执行 IPC,但不需要处理多线程,请使用 Messenger 来实现接口。
使用AIDL
服务端定义
-
创建aidl文件
此文件定义带有方法签名的编程接口。
-
实现接口
Android SDK 工具会基于定义的 .aidl 文件,使用 Java 编程语言生成接口。此接口拥有一个名为 Stub 的内部抽象类,用于扩展 Binder 类并实现 AIDL 接口中的方法。代码中必须扩展 Stub 类并实现这些方法。
-
向客户端公开接口
实现 Service 并重写 onBind(),从而返回 Stub 类的实现。
创建 .aidl 文件
AIDL 使用一种简单语法,允许通过一个或多个方法(可接收参数和返回值)来声明接口。参数和返回值可为任意类型,甚至是 AIDL 生成的其他接口。(AIDL文件的创建和java接口的创建类似,或者就是按照创建java接口的方式(注意:不能像Java 8以上带非抽象方法),然后将文件的扩展名修改为 .aidl)。
AIDL支持的数据:
- Java 编程语言中的所有基本数据类型(如 int、long、char、boolean 等)
- String、CharSequence
- 自定义的Bean(查看以下 “在aidl中使用自定义对象时的步骤或者注意” 内容)
- List(List 中的所有元素必须是以上列表中支持的数据类型,或者声明的由 AIDL 生成的其他接口或 Parcelable 类型。可以选择将 List 用作“泛型”类(例如,List)。尽管生成的方法旨在使用 List 接口,但另一方实际接收的具体类始终是 ArrayList。)
- Map(Map 中的所有元素必须是以上列表中支持的数据类型,或者声明的由 AIDL 生成的其他接口或 Parcelable 类型。不支持泛型 Map(如 Map<String,Integer> 形式的 Map)。尽管生成的方法旨在使用 Map 接口,但另一方实际接收的具体类始终是 HashMap。)
在aidl中使用自定义对象时的步骤或者注意:
-
实现 Parcelable 接口
-
创建声明 Parcelable 类的 .aidl 文件(如下: BookBean.aidl)
package com.renj.service.bean; parcelable BookBean; // BoodBean 为自定义的对象
-
自定义的数据即使与aidl接口文件在相同的包内,也需要通过 import 导包。
定义服务接口时,请注意:<