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<>;
- AIDL解析
- android Services AIDL 解析
- AIDL原理解析
- AIDL原理解析
- Android AIDL实例解析
- Android AIDL实例解析
- Android AIDL用法解析
- aidl深度解析
- AIDL文件实例解析
- AIDL使用解析
- AIDL使用解析
- aidl原理解析
- 深刻解析 Android 的 AIDL
- Android之AIDL使用解析
- Android AIDL机制范例解析
- 【Android进阶】-AIDL使用解析
- Binder框架及AIDL解析
- AIDL生成的类解析
- IntelliJ中pom.xml报错project上Failed to read artifact descriptor for xxxxxxxxx
- Markdown 概识——优缺点
- 应对市场汹涌变革 你需要服装BI解决方案
- array_change_key_case函数
- Zookeeper系列(四)Zookeeper客户端(JAVA)API之创建会话
- AIDL解析
- Python Numpy Tutorials: 数组--4
- Http协议相关知识
- WP_使用_FastCGI_Cache_实现高效页面缓存
- ReactiveCocoa学习篇——【上】
- 01背包问题python实现
- CentOS7下内核源码下载及编译步骤
- 如何避免SSH Secure Shell Client连接Linux超时,自动断开?
- 编程实现strcpy和memcpy函数