Android接口定义语言---AIDL(二)

来源:互联网 发布:html源码metro 编辑:程序博客网 时间:2024/04/29 13:26

1.创建.aidl文件

AIDL使用简单的语法来声明带有多个方法的接口,这个些方法能够带有参数和返回值。参数和返回值可以是任意类型的,甚至是其他AIDL生成的接口。

必须使用Java编程语言来构建.aidl文件。每个.aidl文件必须定义一个单一的接口,并要求只有接口声明和方法签名。

默认情况下,AIDL支持下列数据类型:

1.Java语言中所有的原始数据类型(如int,long,char,boolean等);

2.String

3.CharSequence

4.List

   在List中的所有元素都必须是这个列表中所支持的数据类型,或其他AIDL所生成的接口    或是由你声明的类型。List可以选择使用范型类(如List<String>)。虽然是使用List接口来生成方法,但实际上接受类始终是ArrayList类。

5.Map

   在Map中的所有元素都必须是这个列表中所支持的数据类型,或者是其他的AIDL所生成的接口,或者是由你声明的类型。不支持范型Map(如Map<String, Integer>)。虽然使用Map接口来生成方法,但实际上接受类始终是HasMap。

上述列表中没有列出的其他类型都必须要包含一个import语句,即使是在与接口相同的包中定义的。

在定义Service接口是,要注意:

1.方法能够带有0或多个参数,并且能够返回一个值或void;

2.所有非基本类型的参数都需要方向性的标记,指明数据的走向,既可以是in、out,也可以是inout(详细请看下面的示例)。

默认是in,不能是其他的方式。

警告:你应该把数据走向限制到真正需要的方向,因为编组参数是非常浪费资源的。

3.在.aidl文件中包含的所有代码注释都会被包含在生成的IBinder接口中(除了在import和package语句之前的注释)。

4.仅支持方法,不能暴露AIDL中的静态字段。

以下是一个.aidl文件的示例:

// IRemoteService.aidl

package com.example.android;

 

// Declare any non-default types here with import statements

 

/** Example service interface */

interface IRemoteService {

    /** Request the process ID of this service, to do evil things with it. */

    int getPid();

 

    /** Demonstrates some basic types that you can use as parameters

     * and return values in AIDL.

     */

    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

            double aDouble, String aString);

}

简单的把.aidl文件保存到工程的src/目录中,在编译应用程序时,SDK工具会在工程的gen/目录中生成IBinder接口文件。生成的文件名与.aidl文件名相匹配,只是使用.java扩展名(例如,IRemoteService.aidl,生成结果是IRemoteService.java)。

如果使用Eclipse,增量编译几乎会立即生成绑定器类。如果不使用Eclipse,那么Ant工具会在你下次编译应用程序时生成绑定器类---你应该在完成编写.aidl文件后立即用ant debug(或ant release)来编译工程,以便你的代码能够链接到生成的类。