AIDL 进程间通信

1.Binder 机制

binder 是一个框架 分为客户端,服务端,驱动。

初始化一个binder类的对象后,自身是 一个对象,也会在驱动里生成一个对应的mBinder对象。客户端获取这个binder对象即可以对远程的服务端binder调用了。

所以,调用binder一个是重写服务端的binder类中的onTransact()方法,在这里实现 真正的业务。另外一个就是在客户端获得驱动中该binder的对象,并且调用其中的transact()方法,这时过程就是,客户端进程进入驱动,驱动挂起进程,向远程服务端发送一个消息包裹,包含了客户端传进来的请求。远程服务端执行对应的方法内容,打包为 reply并且 发送一个notify的消息给驱动,驱动把包裹给客户端获取的对象,同时恢复线程。

2.AIDL使用

可以完全使用Binder对系统的服务进行扩展,但是对应用程序自定义的服务就需要用到service。就要用到AIDL,AIDL是一个命令行程序,可以将对应的aidl文本生成相应的java文件。其有 对应的语法 和java基本相同。

使用流程

 第一,写服务端的binder 。写一个aidl文件,编译 之后会对应生成其java文件 。

编译出的文件主要做了三件事:第一个,是生成一个接口,其父类是IIterface,继承下来一个asBinder()方法。

第二个,是生成一个Poxy代理类,该类也实现了接口(也就是自己定义的),其中的接口里面方法的主要作用是对参数进行按照顺序打包,交给也就是Stub(第三件事)进行处理,包括约定好的用于判定是哪一个的常量。

第三个,是写了一个Stub的抽象类,其父类是Binder类,并且实现接口(自己定义的),并且复写里面的方法inTransact(),在里面调用接口里面的 方法(由于是抽象类 ,所以这些方法需要自己完成里面的内容)。这个类 里面提供了一个asInterface()的方法,该方法如果的作用是如果是在本地服务端binder请求调用该服务就直接调用,不在通过binder驱动调用,如果是远程的调用则就会远程调用。

 第二,写一个自定义的service类,其中在 public IBinder onBind(Intent t){   return mBinder;     } 中返回上面的Stub抽象类,并且实现里面的方法,暴露出binder对象。

第三,在客户端获取服务端对应的binder,也就是在服务端启动以后,对应的binder驱动中的服务端的对应对象,其和服务端对象是两个对象。在绑定服务的时候,绑定成功,会回调 ServiceConnection中的 onServiceConnected(ComponentName className,IBinder service)方法,所以在客户端复写这个接口,重写里面的方法,将service保存到本地,即可调用对应的方法了。


AIDL提供了桥梁,客户端是通过本地的代理来请求,服务端是通过本地的代理来返回,真正的通信是在驱动中完成的。两者需要一个共同的规范所以需要用到AIDL。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值