开发笔记
通过AIDL接口在进程间传递数据,记录在开发中遇到的一写问题
AIDL支持数据类型如下:
1. Java 的原生类型
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import)
4. AIDL 自动生成的接口 需要导入(import)
5. 实现android.os.Parcelable 接口的类. 需要导入(import)。
问题1 在传递非基础数据时 在参数前需加修饰符
void getDatas(in byte[] bs); void DataWhole(in PackageData data); }
这里重点是in、out、inout修饰符以及Parcelable的使用!常见的是in、Parcelable,少用的out、inout。
这几种修饰符,可理解如下:
in:客户端的参数输入;
out:服务端的参数输入;
inout:这个可以叫输入输出参数,客户端可输入、服务端也可输入。客户端输入了参数到服务端后,服务端也可对该参数进行修改等,最后在客户端上得到的是服务端输出的参数。
问题2 传递对象时的必要操作
1.必需实现Parcelable接口,内部类必需为静态内部类
2.需在aidl目录创建同类名的AIDL文件,并声明Parcelable,如图
AIDL文件代码就两行
问题3 参数大小的限制
如上在传递byte[] 长度大于1024*1024时会抛出 TransactionTooLargeException 异常
问题4 实现与服务之间互相调用
1.在绑定服务时会返回一个实现了AIDL的对象,这样可以通过对象调用服务中对应实现,
2.可以在应用层实现一个AIDL接口的对象,通过绑定服务返回的AIDL对象回传给服务,这样可以在服务中主动调用应用层的方法实现数据回传通知,
//接收回调 INotification notification = new INotification.Stub() { @Override public void Datas(byte[] bs) throws RemoteException { Log.d(TAG, "Datas: 收到数据=" + Arrays.toString(bs));//已测试 最大数据1024*1024 } }
//传递回调对象 void setNotification(in INotification Notification);
@Override public void onServiceConnected(ComponentName name, IBinder service) { iAidlInterface = IAidlInterface.Stub.asInterface(service); try { iAidlInterface.setNotification(notification); } catch (RemoteException e) { e.printStackTrace(); } }