我们写的aidl文件,系统adk会自动为我们在根目录中生成一个相应的java类文件,但是这个文件比较长,没有仔细关注过,现在对其中的内容进行一些分析:
首先整个文件是一个继承了IIterface的接口类,其中它的内容主要分为两个部分,一个是你在自己的aidl文件中声明的方法,另一个是一个抽象类stub。关于第一部分,两个方法只需要在这里声明一下就可以了,不需要具体的实现过程,主要关注点还是在第二部分。
这个抽象类Stub继承Binder类,并实现你写的aidl文件类,它其中又分为以下几个部分:
1.同在你的aidl文件中所声明几个方法所相对应的几个静态整型常量,用于表示这几个方法
2.一个静态常量:DESCRIPTOR
Binder的唯一标识,一般用你写的那个aidl文件类路径表示
3.一个无参的构造方法
将该类与你的aidl文件类相连接
4.asInterface()方法
通过DESCRIPTOR来查询客户端是否存在该aidl文件类对象,存在返回该对象,不存在就返回之后的Proxy类对象,也可理解成是否在同一个进程中,在就肯定存在该对象,不在就返回Proxy对象了
5.asBinder()方法
将当前对象转成Binder对象返回
6.onTransact()方法
该方法中主要存在两个部分,一个是根据所传入的整形参数code来进行判断执行操作的switch部分,还要一部分就是系统底层封装好的内容,直接调用父类的方法就行。其中switch部分,就是与上述第一点中相应的各个静态整型常量进行判断,然后通过data中取出相应的参数,来执行相应的操作,并把结果写入reply中,注意该方法需要布尔类型的返回值,如果客服端请求成功,就返回true,如果没有成功,才返回false,一般执行了操作的,无论有无结果,都是true。
7.同样实现你所写的aidl文件类的Proxy类
该类的结构其实和它的外部类Stub类似,它需要一个Binder对象,所以存在一个需要传入Binder对象的构造方法,和一个成员变量的Binder对象,同样也存在一个asBinder方法,用来返回这个成员变量,同时还需要一个getInterfaceDescriptor()方法来返回DESCRIPTOR,以上几个方法都是固定的格式的。至于之后的几个方法,取决于你写的aidl文件类中的方法,你的每一个方法都会存在一个对应的方法,其中的内容就是大致就是调用Binder对象的transact()方法,因为调用该方法是在线程中进行,所以注意需要加个try。