6.5.3 处理自定义数据类型的传递
AIDL支持简单数据类型的直接传递,但对于自定义数据类型,需要做一些额外处理。仍以IPowerManager.aidl为例,其使用了android.os.WorkSource这个自定义数据类型,代码如下:
package android.os;//声明android.os包
import android.os.WorkSource;//必须导入该类,即使其与IPowerManager同包
interface IPowerManager
{
……
//自定义类型指定了in方向标记
void updateWakeLockWorkSource(IBinder lock, in WorkSource ws);
……
}
如果仅有以上代码是无法使用WorkSource类的。WorkSource是由AIDL使用的类,其必须符合AIDL语法规则,要满足这一要求,首先需要定义WorkSource的AIDL文件,然后实现WorkSource类。WorkSource的AIDL文件位于frameworks/base/core/java/android/os/WorkSource.aidl,其代码如下:
package android.os;
parcelable WorkSource;//以parcelable关键字声明WorkSource
可见在WorkSource.aidl文件中,只需要以parcelable关键字表明WorkSource是实现了Parcelable接口。
以AIDL文件形式声明WorkSource后,便可以提供WorkSource的实现类,其位于frameworks/base/core/java/android/os/WorkSource.java文件中,其代码如下:
package android.os;
//实现了Parcelable接口
public class WorkSource implements Parcelable{
int mNum;
int[]mUids;
……//省略其他成员变量和方法
//将当前对象的信息写入Parcel,这样便可以在不同进程间传递
@Override
public void writeToParcel(Parcel dest, int flags){
dest.writeInt(mNum);
dest.writeIntArray(mUids);
}
//必须实现Parcelable中定义的Creator接口,该接口提供从Parcel中还原WorkSource对象的方法
public static final Parcelable.Creator<WorkSource>CREATOR
=new Parcelable.Creator<WorkSource>(){
public WorkSource createFromParcel(Parcel in){
return new WorkSource(in);
}
public WorkSource[]newArray(int size){
return new WorkSource[size];
}
};
}
通过以上代码便可以实现在不同进程间传递自定义对象了。
AIDL及其工具提供了在Java层实现基于Binder通信的C/S架构的核心实现,简化了开发Java层服务的工作流程。