Android AIDL之in out inout
来源:互联网 发布:悦诗风吟雪耳面霜知乎 编辑:程序博客网 时间:2024/05/19 13:27
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 中的静态字段。
三、in out inout
1. 原语类型
//定义接口void getXutaoTestData(int value); //测试1void getXutaoTestData(in int value); //测试2void getXutaoTestData(out int value); //测试3void getXutaoTestData(inout int value); //测试4//客户端int value = 5;PlaybackServiceUtil.getXutaoTestData(value);sService.getXutaoTestData(value);KGLog.d("xutaoxutao123", "Util: value = " + value);//服务端(service)@Overridepublic 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 = 5com.kugou.android D/xutaoxutao123: Util: value = 5//测试3,测试4 编译不过//结论:原语默认为in,且不能是out或inout
2. 非原语类型,例float[]
只贴出部分代码
//定义接口void getXutaoTestData(float[] value); //测试1void getXutaoTestData(in float[] value); //测试2void getXutaoTestData(out float[] value); //测试3void 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)@Overridepublic 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.0Util: 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.0Util: 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.0Util: 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.0Util: 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;}//
就这些了,有什么不对请指出!
0 0
- Android AIDL之in out inout
- IPC之AIDL(2)in out inout
- [Android]AIDL中的in,out,inout理解
- Android AIDL中的in,out,inout含义
- AIDL中的in,out,inout
- AIDL中的in,out,inout
- Android远程接口之AIDL——Parcelable、in、out、inout简例
- AIDL源码解析in、out和inout
- AIDL的 in,out,inout指向
- AIDL中的in、out、inout是什么?
- android AIDL : 你真的理解AIDL中的in,out,inout么?
- 关于Android中aidl的关键词in,out,inout的探索
- “In/out/inout” in a AIDL interface parameter value?
- AIDL中in,out和inout的区别
- 你真的理解AIDL中的in,out,inout么?
- 你真的理解AIDL中的in,out,inout么?
- 关于aidl参数方向in,out,inout网上的解释
- 你真的理解AIDL中的in,out,inout么?
- RabbitMQ使用场景练习:工作队列(二)
- 起点
- flume整合kafka和hdfs
- Android网络请求使用Retrofit+OkHttp,如何获取请求参数 ?
- HTML5基础(indexedDB)
- Android AIDL之in out inout
- css hack
- iOS打包成 ipa包
- css中zoom的作用
- SQL Server 2008 查询表字段相关属性
- CDH调优
- Hbase原理、基本概念、基本架构
- 一个模块
- Leetcode: LetterCombinationsofaPhoneNumber 根据手机按键,给出所有可能的字符串