AIDL

AIDL使用流程如下:

  1. 服务端需要创建Service来监听客户端请求,然后创建一个AIDL文件,将暴露给客户端的 接口在AIDL文件中声明,最后在Service中实现这个AIDL接口即可;
  2. 客户端首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。

注意事项:

  1. AIDL支持的数据类型:
    i. 基本数据类型、String、CharSequence
    ii. List:只支持ArrayList,里面的每个元素必须被AIDL支持
    iii. Map:只支持HashMap,里面的每个元素必须被AIDL支持
    iv. Parcelable
    v. 所有的AIDL接口本身也可以在AIDL文件中使用
  2. 自定义的Parcelable对象和AIDL对象,不管它们与当前的AIDL文件是否位于同一个包,都必须显式import进来。
  3. 如果AIDL文件中使用了自定义的Parcelable对象,就必须新建一个和它同名的AIDL文件,并在其中声明它为Parcelable类型;

    package com.ryg.chapter_2.aidl;
    parcelable Student; 
  4. AIDL接口中的参数除了基本类型以外都必须表明方向in/out。AIDL接口文件中只支持方 法,不支持声明静态常量;

    void addStudent(in Student student);
  5. AIDL方法是在服务端的Binder线程池中执行的,因此当多个客户端同时连接时,管理数 据的集合直接采用 CopyOnWriteArrayList 来进行自动线程同步。类似的还有 ConcurrentHashMap ;
  6. 因为客户端的listener和服务端的listener不是同一个对象,所以RecmoteCallbackList 是系统专门提供用于删除跨进程listener的接口,支持管理任意的AIDL接口,因为所有AIDL接 口都继承自 IInterface 接口。

    public class RemoteCallbackList<E extends IInterface>

    它内部通过一个Map接口来保存所有的AIDL回调,这个Map的key是 IBinder 类型, value是 Callback 类型。当客户端解除注册时,遍历服务端所有listener,找到和客户端 listener具有相同Binder对象的服务端listenr并把它删掉;

  7. 客户端RPC的时候线程会被挂起,由于被调用的方法运行在服务端的Binder线程池中, 可能很耗时,不能在主线程中去调用服务端的方法。

注:Android studio AIDL

  1. 在‘java’平行目录下右键新建AIDL文件;
  2. 实体类的包要与.aidl的包同名(但并非相同包);
    这里写图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值