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层服务的工作流程。