AIDL初步理解

        AIDL(Android 接口定义语言) 是 Android 提供的一种进程间通信 (IPC) 机制。我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口。这里主要应用于framework层编译和软硬件结合上面

一 AIDL简单使用

    1  在service和client创建相同的文件aidl文件,路径也需要相同 例如 IBookManager.aidl

    2 通过makeproject系统编译 在gen文件下会生成相应的java文件 生成IBookManager.java

    3 服务端注册service 在service中 初始化 aidl类的stub内部类 IBookManager.Stub 并通过onBind方法返回

    4 客户端通过bindservice中serviceconnection的方法onserviceconnected方法中的IBinder参数,通过

IBookManager iBook = IBookManager.Stub.asInterface(service);得到代理类 可以进行跨进程间操作
二 注意事项
    1 aidl文件中传输非基本类型需要将类通过parcelable实现序列化并且建立相应的aidl文件还需要在使用文件中手动import

    2 再穿传入非基本类型时前面需要添加in out inout等关键字 关键字作用是是否对参数进行传递并修改赋值

    3 aidl文件只支持方法不支持静态常量 也是因为序列化传参问题

    4 通信是同步操作注意不要在主线程操作 防止有演示操作

    5 客户端不能抓取服务端部分异常

三 基本原理

1 client 通过binderservice得到BinderProxy 将他作为参数得到IBookManager.Stub.proxy对象 这个类主要是对BinderProxy进行包装将方法参数经过处理可以跨进程通讯。

2 client得到代理类BinderProxy传值通过tansact方法将序列化的参数通过native方法传入内存binder驱动找到目标引用进而调用服务端的 transact方法 通过onTransact方法验证一些是否是目标类并进行相应方法调用

3 服务端的引用会在初始化时通过native方法 binder驱动得到句柄


四 额外了解

    1  客户端得到的都是BInderProxy类 这个类不会被继承  在客户端中IBookManager.Stub.asInterface(service)只要IBinder不为空就不会报错 调用方法时才报错 报错原因是因为写入的DESCRIPTOR 不同

 2 同样自己也可以编写java代码来替代不用系统自动生成的 通过方法onTransact 来验证是否正确 客户端可以不用写相应的代码 

 3 系统生成的文件主要作用就是将方法code和参数序列化后分别放入 reply和data中 回收并通过哦transact传值

 



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值