跨进程调用Service(AIDL Service)流程2(复杂数据)

——服务端——
当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个文件到客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值