——服务端——
当Service与外部通信时,需要传递复杂数据,即Stub子类中的getxxx()方法的参数与返回值为复杂数据(以类封装的数据)时:
1.参数与返回值的java类都必须实现Parcelable接口
2.它们都要各自定义AIDL.
例如:A.aidl:
parcelable A;
B.aidl:
parcelable B;
因为它们的数据其实都在各自java类中,所以它们的AIDL定义其实只需要一行即可。
他们的java类中,例如参数类A:
public class A implements Parcelable{
...(各属性及其getter,setter方法,构造方法及各功能方法如equals()方法等)
/*实现Parcelable接口必须实现的方法*/
@override
public int describeContents(){
return 0;
}
/*实现Parcelable接口必须实现的方法,用于将A对象的各数据写入Parcel中*/
@override
public void writeToParcel(Parcel dest,int flags){
dest.writeInt(xxx);
dest.writeString(xxx);
...
}
/*添加一个静态成员CREATOR,它实现了Parcelable.Creator接口*/
public static final Parcelabel.Creator<A> CREATOR=new Parcelable.Creator<A>(){
/*用于从Parcel中读取数据*/
@override
public A createFromParcel(Parcel source){
return new A(source.readInt(),source.readString(),...);//与上面的writeToParcel方法对应
}
@override
public A[] new Array(int size){
return new A[size];
}
}
}
返回值类B与参数类A相似
Service类与前一章普通数据类似,只是Stub子类的getter方法改为复杂数据的getter方法,如:
@override
public List<B> getB(A a) throws RemoteException{
return as.get(a)//as为Map<A,List<B>>集合
}
——客户端——
和上一章普通数据时相似,只是取值时略有不同(因为数据类型不同而导致处理方法略有差异)
总结:传递普通数据时,只定义了一个Stub对应的AIDL,也只需要从服务端复制这一个文件到客户端
而在复杂数据时,需要有3个AIDL文件:参数类AIDL,返回值类AIDL,Service中的Stub对应的AIDL。而在复制时,还需要把参数类和返回值类的java代码一同复制过去,所以,传递复杂数据时,共需要复制5个文件到客户端。