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

来源:互联网 发布:java主方法入口 编辑:程序博客网 时间:2024/05/30 12:29

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

0 0
原创粉丝点击