AIDL解析

来源:互联网 发布:淘宝名字叫什么好 编辑:程序博客网 时间:2024/06/08 15:16

AIDL解析

定义

AIDL:Android接口定义语言,顾名思义.aidl文件是一个接口文件。主要是对Binder进行操作。在新建IPersonInterface.aidl文件后,在app/generated/source/aidl/debug/目录下,可以看到具体的.aidl文件实现。
其内部实现主要是内部抽象类:Stub及其内部代理类proxy();
Stub继承了android.os.Binder,因此本质上是一个Binder,同时也实现了定义的aidl接口。

Stub主要成员有:

1、一个全局final字符串DESCRIPTOR,用来唯一标识该类。

2、public static com.yf.jar.aidl.IPersonInterface asInterface(android.os.IBinder obj),从方法构造来看,传入的是一个Binder对象,返回的是一个aidl对象。如果是同一个进程直接返回当前IPersonInterface,如果不是同一进程,则调用Proxy类返回远程IPersonInterface。

3、asBinder()方法

@Override public android.os.IBinder asBinder(){   return this;}

在Stub类内部,返回的是一个Stub对象,即Binder

4、onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) 具体的数据交互方法。

5、Proxy类,内部实现了aidl接口中定义的方法,运行在服务端。

6、内部实现了aidl接口中定义的方法。有些人人会问,这些方法和5中的一样吗?定义是一样,但是Proxy中的方法主要是运行在客户端的,而此处的运行在服务端也就是Service中的。为什么呢?由于asInterface(IBinder Binder)方法的存在,在客户端调用此方法,会返回一个com.yf.jar.aidl.IPersonInterface.Stub.Proxy(Binder)。

代码实现:

1、注册实现一个service,并在其中实现IPersonInterface.Stub()的匿名内部类,在其中实现IPersonInterface.aidl接口的业务逻辑,返回一个Binder。
在Servie的onBinder中返回一个Binder;

2、在Actvity中通过bindService(Intent,ServiceConnection,flags)绑定具体的service,并通过实现ServiceConnection的匿名内部类,在其中取得远程进程的Binder所对应的aidl接口,意味着:此时取到的Stub().proxy对象。那么调用的方法也是Proxy内部类中的方法。

流程:以getPersonList为例

1、客户端取得Proxy对象,并调用Proxy中的getPersonList()方法;

2、mRemote.transact(Stub.TRANSACTION_getPersonList, _data, _reply, 0);调用Stub中的getPersonList()方法,同时将结果放入reply中;

3、回到当前线程,将reply写入result,并返回结果;

4、这些都是间接的存入Bindre中的。

注意

1、AIDl能传递的数据总共有6种,其中自定的Parcelable类,需要需要定义一个同名的.aidl,且需要import语句导入;aidl接口本身,只需要import导入就好。

2、客户端的死亡重连;

3、使用RemoteCallbackList<>替代CopeOnWriteArrayList<>;

0 0