Android AIDL之in out inout
2016-12-20 13:27
399 查看
Android AIDL之in out inout
可能很多人会不清楚定义aidl接口到底如何定义为好,这里还是总结一下,毕竟笔记是最深刻的理解。一、aidl支持哪些数据类型呢?
Java 编程语言中的所有原语类型(如 int、long、char、boolean、String、CharSequence 等等)List
List中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
Map
Map中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map
二、定义服务接口时,请注意:
方法可带零个或多个参数,返回值或空值。所有非原语参数都需要指示数据走向的方向标记。可以是 in、out 或 inout
原语默认为 in,不能是其他方向。
.aidl 文件中包括的所有代码注释都包含在生成的 IBinder 接口中(import 和 package 语句之前的注释除外)
.aidl 文件中方法名不能重复,不管参数是否相同
只支持方法;不能公开 AIDL 中的静态字段。
三、in out inout
1. 原语类型//定义接口 void getXutaoTestData(int value); //测试1 void getXutaoTestData(in int value); //测试2 void getXutaoTestData(out int value); //测试3 void getXutaoTestData(inout int value); //测试4 //客户端 int value = 5; PlaybackServiceUtil.getXutaoTestData(value); sService.getXutaoTestData(value); KGLog.d("xutaoxutao123", "Util: value = " + value); //服务端(service) @Override public void getXutaoTestData(int value) throws RemoteException { try { KGLog.d("xutaoxutao123", "Service: value = " + value); value = -1; }catch (Exception e){ AidlExceptionMgr.processAidlExp(e); } } //测试1,测试2 结果相同 com.kugou.android.support D/xutaoxutao123: Service: value = 5 com.kugou.android D/xutaoxutao123: Util: value = 5 //测试3,测试4 编译不过 //结论:原语默认为in,且不能是out或inout
2. 非原语类型,例float[]
只贴出部分代码
//定义接口 void getXutaoTestData(float[] value); //测试1 void getXutaoTestData(in float[] value); //测试2 void getXutaoTestData(out float[] value); //测试3 void getXutaoTestData(inout float[] value); //测试4 //客户端 float[] value = new float[]{1f, 2f, 3f}; PlaybackServiceUtil.getXutaoTestData(value); sService.getXutaoTestData(value); KGLog.d("xutaoxutao123", "Util: value[0] = " + value[0] + ", value[1] = " + value[1] + ", value[2] = " + value[2]); //服务端(service) @Override public void getXutaoTestData(float[] value) throws RemoteException { try { KGLog.d("xutaoxutao123", "Service: value[0] = " + value[0] + ", value[1] = " + value[1] + ", value[2] = " + value[2]); value[0] = 0.1f; value[1] = 0.2f; value[2] = 0.3f; }catch (Exception e){ AidlExceptionMgr.processAidlExp(e); } } //测试1,编译不过 //测试2,服务端可以接收到客户端数据,客户端不能接收到服务端数据 Service: value[0] = 1.0, value[1] = 2.0, value[2] = 3.0 Util: value[0] = 1.0, value[1] = 2.0, value[2] = 3.0 //测试3,服务端不能接收到客户端数据,客户端能接收到服务端数据 Service: value[0] = 0.0, value[1] = 0.0, value[2] = 0.0 Util: value[0] = 0.1, value[1] = 0.2, value[2] = 0.3 //测试4,服务端能接收到客户端数据,客户端也能接收到服务端数据 Service: value[0] = 1.0, value[1] = 2.0, value[2] = 3.0 Util: value[0] = 0.1, value[1] = 0.2, value[2] = 0.3 //如果服务端value = new float[]{0.1f, 0.2f, 0.3f},则不能接收到服务端数据; Service: value[0] = 0.0, value[1] = 0.0, value[2] = 0.0 Util: value[0] = 0.0, value[1] = 0.0, value[2] = 0.0 //结论:非原语要带上in、out或inout,否则编译不过;in,out与inout使用方法如上。
3. in out inout是怎么做到数据方向的控制呢?
Android SDK 工具会生成一个以 .aidl 文件命名的 .java 接口文件。生成的接口包括一个名为 Stub 的子类,这个子类是其父接口(例如,IKugouPlaybackService.Stub)的抽象实现,用于声明 .aidl 文件中的所有方法。
// .java接口文件中数据传输 @Override public void getXutaoTestData(float[] value) throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); _data.writeFloatArray(value); //有in时将value写给_data /* 没有in的时候是这样的 if ((value==null)) { _data.writeInt(-1); }else { _data.writeInt(value.length); } */ mRemote.transact(Stub.TRANSACTION_getXutaoTestData, _data, _reply, 0); _reply.readException(); _reply.readFloatArray(value); //有out时将_reply读回给value //没有out的时候是这样的,就没有_reply.readFloatArray(value)这句代码 } finally { _reply.recycle(); _data.recycle(); } } //没有in只有out的时候只传了一个空数组过去,所以服务端接收不到数据,但客户端可以接收数据 case TRANSACTION_getXutaoTestData: { data.enforceInterface(DESCRIPTOR); float[] _arg0; int _arg0_length = data.readInt(); if ((_arg0_length<0)) { _arg0 = null; } else { _arg0 = new float[_arg0_length]; } this.getXutaoTestData(_arg0); reply.writeNoException(); reply.writeFloatArray(_arg0); return true; } //
就这些了,有什么不对请指出!
相关文章推荐
- Android AIDL中的in,out,inout含义
- android AIDL : 你真的理解AIDL中的in,out,inout么?
- 关于Android中aidl的关键词in,out,inout的探索
- android aidl in out
- [Android]AIDL中的in,out,inout理解
- Android远程接口之AIDL——Parcelable、in、out、inout简例
- AIDL 编译报can be an out parameter, so you must declare it as in, out or inout原因探究
- Out Of Memory Error in Android - part 1
- AIDL 编译报can be an out parameter, so you must declare it as in, out or inout原因探究
- google地图 for android 动态桌面放大缩小 zoom in/out
- AIDL中in,out和inout的区别
- Android transitions- slide in and slide out
- 你真的理解AIDL中的in,out,inout么?
- Android transitions- slide in and slide out
- 你真的理解AIDL中的in,out,inout么?
- 你真的理解AIDL中的in,out,inout么?
- 你真的理解AIDL中的in,out,inout么?
- Android Bitmap zoomIn/zoomOut/rotate ——图片的缩小,放大 和旋转(转)
- 你真的理解AIDL中的in,out,inout么?