但Aidl默认支持的类型包括Java 原始类型(如int、long、boolean等) 和 基础封装类型(如String、List、Map、CharSequence),
为便于阐释AIDL是如何支持自定义类型传递,写了一个demo,下载地址如下:
http://files.cnblogs.com/files/tonybright/service.zip
下面的分析基于这个demo进行,MyActivity需启动TonyService,并通过setEmployee接口,传递一个employee对象过去,然后调用getEmployeeInfo获取
employee信息。
1.自定义类型需要实现Parcelable接口,override writeToParcel这个api,这个会在将实体写入Parcel时使用
MainActivity调用setEmployee的代码如下:
mService.setEmployee是一个binder调用,具体实现可以看ITonyService.setEmployee(Bp端)
2.自定义类型中需要定义一个名为CREATOR的静态变量,其实现Parcelable.Creator接口及方法,
它的作用是在Binder Bn端读取parcel时用于构建Employee实例。代码实现在ITonyService.setEmployee(Bn端)
这个静态实例CREATOR是在aidl中约定好的,因此不能换成其他名字。
3.为自定义类Employee创建一个同名aidl声明文件Employee.aidl,如下:
package com.example.service;
parcelable Employee;
4.使用Employee的service aid文件ITonyService.aidl中声明方式如下:
5.Android Studio或Intellij中有自动生成parcellable类的插件:Android Parcellable code generator,比较方便。