两种AIDL用法分析(原)
来源:互联网 发布:2016年3月非农数据 编辑:程序博客网 时间:2024/06/06 18:22
为了便于分析,我们还拿第一节中我们自己搭建的例子去分析。
当时我们在Eclipse Android工程的Java包目录中建立了一个扩展名为aidl的文件(IMyService.aidl),并写下需要的接口。Eclipse会在gen目录下生成一个IMyService.Java的文件。
一、整体结构
我们打开IMyService.Java文件查看,发现他的结构是这样的:
下面是一个结构图: 整体上来看,IMyService.java文件中的IMyService类有一个Stub的内部类,还有一个getValue方法。这个方法就是我们在aidl中定义的方法。同时我们看到,生成的IMyService继承自IInterface,说明这也是一个接口,并没有对getValue进行实现。
对于getValue这个方法,当我们在服务端的内部类中继承了IMyService.Stub抽象类以后,就需要对未曾实现的getValue方法进行定义。再来看IMyService的内部类Stub。这个内部类是一个实现了IMyService接口的Binder抽象类。内部有3个方法asInterface、asBinder、onTransact,还有一个内部类Proxy。
二、得到的远端Service对象
现在我们来看一下客户端当初得到的服务端对象的情况,当我们连接上服务端后,会被动调用onServiceConnected方法:
在这里得到的service对象其实就是MyServiceImpl对象,他是实现了IMyService.Stub具体接口的IBinder。再来看一下asInterface:
可以看出,onServiceConnected参数是远程服务端的IBinder对象,返回值是IMyService.Stub.Proxy(obj),这里的Proxy是Stub的内部类:
内部除了构造方法以外,只有getValue方法: 到这里我们看到,Proxy内部确实拥有服务端的各个方法,但这些方法并不是真实的实现,而只是通过mRemote.transact传输出去。 也就是说,在客户端通过mIMyService = IMyService.Stub.asInterface(service)得到的就是Proxy对象,可以通过这个对象间接的调用服务端的各个方法,而具体调用过程就是经过mRemote.transact传输给真正的Service(也就是MyService.MyServiceImpl类)。那么,具体来说,我们是如何通过这个代理对象调用到真实的getValue呢?
三、如何通过代理对象调用远端Service方法
在代理类的getValue方法中看到,他是调用了mRemote.transact的方法。
而mRemote.transact的方法通过底层的Binder通讯,将数据传输给服务端进程,并调用服务端的onTransact方法:
因为当初得到的远程服务对象是MyServiceImpl的对象,因此这里的this就指向了MyServiceImpl类。因此getValue方法就进入到了MyServiceImpl的内部,也就是远程服务端的内部。由此完成了一次完整的调用过程。四、AIDL总结
1、AIDL要是实现的最终目标是跨进程访问,简单的说就是得到另一个进程的对象,并调用其方法。2、AIDL与接口类似,本质属性都是一个Interface(AIDL文件是IInterface,而Interface是继承自Interface的),而且都只定义了抽象方法,没有具体的实现,需要子类去实现。
3、与接口不同的是:由AIDL生成的stub类本质上是一个Binder!这个类所生成的对象有两种方式可以传递给另外一个进程:
3.a、一种是通过bindService的方式,绑定一个服务,而在绑定后,服务将会返回给客户端一个Binder的对象,此时可以把继承自stub的Binder传递给客户端。
3.b、另外一种就是把继承自stub的类提升为系统服务,此时,我们通过ServiceManager去得到当前的系统服务,ServiceManager就会把目标Service的Binder对象传递给客户端。
4、经过上面两种方法得到的Binder对象,就像得到了本地的某个对象一样,可以调用其远程的方法。
原文地址: http://blog.csdn.net/u010961631/article/details/12082161
- 两种AIDL用法分析(原)
- 两种AIDL用法分析(原)
- 两种AIDL用法分析(原)
- 两种AIDL用法分析
- 两种AIDL用法分析
- 应用层的AIDL用法(原)
- 应用层的AIDL用法(原)
- Framework中的AIDL(原)
- Framework中的AIDL(原)
- Framework中的AIDL(原)
- AIDL详解(AIDL、Messenger两种方式实现跨进程通信,传递自定义对象)
- AIDL原理解
- SPSiteDataQUery 用法总结(原)
- Aidl 分析
- 分析SQL Server里函数的两种用法
- ContentProvider源码分析(原)
- ContentProvider源码分析(原)
- ContentProvider源码分析(原)
- ECMA-340(ISO 18092) 学习
- 应用层的AIDL用法(原)
- 函数模板深入研究
- Framework中的AIDL(原)
- 【hdu 1711】 Number Sequence KMP模板
- 两种AIDL用法分析(原)
- Binder源码分析之ServiceManager(原)
- Binder源码分析之驱动层(原)
- Binder源码分析之Native层(原)
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- Binder源码分析之Java层(原)
- Unity3D 5.3 新版AssetBundle使用方案及策略
- linux 红黑树代码
- Coursera Machine Learning Week 7 - Support Vector Machines