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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ai卡住了没保存怎么办 屁股沟有硬块红肿怎么办 卧室床选太大了怎么办 画板的笔尖掉了怎么办 宜家水壶盖子有水怎么办 背滤鱼缸除油膜怎么办 书多了没地方放怎么办 学生在教室内丢手机怎么办 新车尾箱坏了怎么办 放书的箱子烂了怎么办 车钥匙锁后备箱里怎么办 布的收纳箱有味怎么办 车漆清漆层掉了怎么办 副驾驶储物箱卡子断了怎么办 玛莎拉蒂车门打不开怎么办 新买的水杯漏水怎么办 泰迪小狗掉毛怎么办 手机jlc调用接口状态异常怎么办 进门和厕所对着怎么办 p过的照片有竖条怎么办 当照片p出竖条纹怎么办 月子里落下脚心怕风怕凉怎么办 鞋胶把手粘住了怎么办 凉鞋魔术贴长了怎么办 新买的狗一直叫怎么办 刚买的幼犬老叫怎么办 狗狗什么都不吃怎么办 新买的吊扇风小怎么办 夜市卖果汁没电怎么办 榻榻米太长2米45怎么办 木质桌子黏黏的怎么办 白色塑料桌子染色了怎么办 3dmax模型变透明了怎么办 刚养的兔子不吃怎么办 熊猫兔不吃下喝怎么办 熊猫兔感冒了一直打喷嚏怎么办 兔子后腿骨断了怎么办 兔子的腿肿了怎么办 仓鼠喝了牛奶该怎么办 宠物兔不吃不喝怎么办 兔子把木屑吃了怎么办?