14.1.1. 编写AIDL
优质
小牛编辑
137浏览
2023-12-01
14.1.1.编写AIDL
先定义Service的接口。如下可见,它与一般的Java接口十分相似。有CORBA经验的读者肯定可以认出AIDL与CORBA的IDL之间的渊源。
例 14.1. ILogService.aidl
package com.marakana.logservice; //
import com.marakana.logservice.Message; //
interface ILogService { //
void log_d(String tag, String message); //
void log(in Message msg); //
}
- 同Java一样,AIDL代码也需要指明它所在的package;
- 不同在于,即使在同一个package中,我们仍需显式地导入其它的AIDL定义。
- 指定接口的名字。按照约定,名字以I字母开头。
- 这个方法很简单,只有表示输入的参数而没有返回值。留意String不是Java的基本类型,不过AIDL把它当作基本类型对待。
- 这个方法取我们自定义的Message对象作为输入参数。它的定义在后面给出。
接下来查看对应Message的AIDL实现。
例 14.2. Message.aidl
package com.marakana.logservice; //
/* */
parcelable Message;
- 指明所在的package。
- 声明Message是一个可序列化(parcelable)的对象。这个对象将在Java中定义。
到这里我们已经完成了AIDL部分。在你保存文件的同时,Eclipse会自动生成服务端相关代码的占位符(stub)。它像是完整的一个服务端,可以接受客户端的请求,但实际上里面并没有任何业务逻辑,具体的业务逻辑还需要我们自己添加,这就是为什么称它为“占位符”。新生成的Java文件位于Gen目录之下,地址是/gen/com/marakana/logservice/LogService.java。因为这些代码是根据AIDL生成的,因此不应再做修改。正确的做法是,修改AIDL文件,然后使用Android SDK的aidl工具重新生成。
有了AIDL和生成的Java stub文件,接下来实现这个Service。