6.5.2 AIDL语法
AIDL语法包括七大部分。
import:用于导入一个类,其与Java语言的不同之处在于,即便导入的类与当前AIDL文件在同一目录,也需要显式导入。
package:用于声明该AIDL生成的Java类文件所在的包名。
interface:用于声明一个AIDL的服务接口。
oneway:用于修饰interface和方法,表示Client不需要等待Server端服务方法返回,oneway interface表示该interface中所有方法都是oneway,通常oneway方法的返回类型都为void。既然不需要等待Server端服务方法返回,因此在Client端的Proxy中也就不需要读取reply返回结果了。
数据类型:AIDL列出的支持的类型可以作为参数或返回值使用。
方向标记:用于标记参数的输入/输出类型。
parcelable:用于声明一个在AIDL中使用的自定义类(见6.5.3节)。
import、package、interface、oneway都比较简单,本节分析数据类型和方向标记这两部分内容。
1.数据类型
AIDL并不能处理所有Java类型,其支持的数据类型有以下四类:
Java基本数据类型及其数组,如int、long、char、boolean、byte[]等。
String和CharSequence及其数组,如String[]。
android. os.Ibinde.
List和Map。
AIDL对数据类型的使用有以下限制:
Java基本数据类型、String和CharSequence以及IBinder可以直接使用,不用import导入。
List和Map中的元素只能是Java基本类型、String、CharSequence、IBinder、AIDL文件生成的接口和Parcelable及其子类。
AIDL文件生成的接口类型和Parcelable及其子类必须使用import导入,即使其与当前AIDL文件位于同一个包中也如此。
其他数据类型不能在AIDL中使用。
2.方向标记
以AIDL文件生成的接口类型和Parcelable及其子类作为参数时,需要指定方向标记(directional tag),方向标记有in、out和inout三种。基本类型数据默认方向标记为in。这三个方向标记的意义如下:
in表示参数由Client端设置并传递到Server端服务方法,服务方法需要根据该参数做出处理。
out表示参数由Client端传递到Server端服务方法,服务方法将设置该参数并将其返回Client端。
inout表示Client端和Server端服务方法操作同一个参数。通常情况下,由Client提供一个参数值,Server端服务方法修改该值并返回。
AIDL文件指定的参数需要在进程间传递,传递的过程要经过marshaling/unmarshaling操作,实现参数的内存格式与对象格式的互转,指定方向标记可以节省一些转换工作,提高性能。