简述AIDL通信的使用

  对于普通的服务和客户端之间的通信:

-服务端:

1.在服务的定义过程中,创建一个Binder类对象;

2.对Binder对象封装一些自己定义的方法;

3.然后在onBind方法中return这个Binder类对象(onBind定义的返回值是IBinder,Binder的父类);

4.然后在menifest里注册服务;

5.开启服务。

-客户端:

1.创建一个ServiceConnection的对象,重写里面onServiceConnected的方法;

2.在上述方法里获得在服务定义那里返回的IBinder对象;

3.通过向下转型为Binder对象后,就可以引用Binder里的绑定方法了;

4.开启和绑定服务。

这种方式解决了开启服务后,开启者,比如活动,会与服务没有什么关联的问题,主要是通过IBinder来传递服务想让服务需求者使用的功能或者方法。


  对于AIDL服务和客户端的通信:

-服务端:

1.编写一个接口的aidl文件,把原本要在服务里的Binder对象的需要我们自己定义的方法放在这里面来定义,系统会自动生成对应的接口类;

2.用接口自带的方法(.Stub())创建IBinder对象,在IBinder对象里实现接口中定义的方法;

3.在onBind中返回。

-客户端:

1.在onServiceConnected里获得IBinder对象,把它向下转型为接口(其实已经是自动生成的接口类,.Stub()是IBinder,它的.asInterface()把IBinder又转回接口);

2.调用接口里定义的方法,实现使用服务的功能。

这个过程就是 aidl接口->IBinder->传递->IBinder->aidl接口,从服务里定义的aidl接口,到变成IBinder对象后传递到客户端,然后在到客户端把IBinder变回aidl接口,这就是意味着双方都需要aidl接口文件。

对于服务端,在原本的包内创建idl文件,对于客户端,需要创建一个和服务端包名称一样的包,然后在里面创建和服务端一样的idl文件,另外,在用intent隐式匹配服务的action时,需要为intent指定要访问的包名,也就是程序,用setPackage指定。


  原本来说,多进程之间是不分享内存的,所以很多实例和方法都是不共享的,我们虽然可以通过代码的形式去实现这种共享功能(手动创建多进程间的Binder),但代码过于繁杂,而通过使用aidl文件来定义需要被分享的方法,系统会自动地帮我们生成这些代码,从而简化我们的开发,这也是iadl的由来。


***  稍微具体来解析aidl的过程:

编写aidl文件,并在里面定义一个接口,然后在接口里定义服务端能提供给客户端的服务或者说方法,这里面自动做了哪些操作呢?

首先,服务端想要客户端来调用自己的方法,就像在同一个进程中的2个类一样,服务端需要提供调用接口给客户端,客户端在设置好需要实现的回调函数后,他们之间就可以进行数据交流了,而在多进程中,可以使用Binder来传递接口,而要能使用Binder来传递的接口,必须继承自IInterface接口,并实现该接口要求你实现的函数,而编写aidl文件,系统就会自动帮你实现继承IInterface的操作以及IInterface接口需要你实现的方法。具体需要实现哪些方法呢?

比较重要的一个是定义一个名为Stub(其实可以是别的名称)的Binder类,这个Stub同时继承我们在aidl里定义的接口,目的是要为这个Binder封装我们定义在接口里的方法,这个封装过程的内部实现系统会自动帮我们实现,这个内部实现里比较重要的是,把Binder对象(继承过aidl指定的接口)变回aidl指定接口的方法asInterface。asInterface方法在判断到属于多线程时,会直接返回Binder的Proxy类,该类在内部需要指定继承我们定义的接口,以便于asInterface返回的自定义接口是一个以及被系统自动实现内部的proxy类实例,然后就是proxy调用onTransact,等等等等。整体上看,也就是通过在aidl文件里定义接口,然后让系统自动帮我们创建一个用于多进程交互的Binder类,里面实现并封装了我们在自定义接口里指定的方法(具体的方法在proxy和onTransact里,也就是客户端和服务端真正交互的工具)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值