Android艺术探索笔记 - 创建AIDL文件后自动生成的文件分析
在Eclipse新建aidl如下
Book.aidl定义:
//Book类在aidl的声明,要在IBookManagerimportbook类,否则IBookManager报错找不到Book类
package com.example.testbinder;parcelable Book;
IBookManager.aidl定义:
package com.example.testbinder;import com.example.testbinder.Book;interface IBookManager{List<Book> getBookList();void addBook(in Book book);
}
在项目中创建IBookManager.aidl时,会在gen目录下生成一个对应的java文件,这个文件是aidl执行过程的核心。代码整理后如下
/** This file is auto-generated. DO NOT MODIFY.* Original file: /home/caihuijian/workspacefolder/TestBinder/src/com/example/testbinder/IBookManager.aidl*/
package com.example.testbinder;public interface IBookManager extends android.os.IInterface {// 内部类 Stub,继承了Binder,所以Stub就是一个Binder类/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implementscom.example.testbinder.IBookManager {// Binder唯一标识,一般用当前aidl的完整包名+类名表示private static final java.lang.String DESCRIPTOR = "com.example.testbinder.IBookManager";/** Construct the stub at attach it to the interface. */// 构造函数public Stub() {// 关联指定接口和Binder this--接口, DESCRIPTOR--代表binderthis.attachInterface(this, DESCRIPTOR);}/*** Cast an IBinder object into an com.example.testbinder.IBookManager* interface, generating a proxy if needed.* * 将IBinder转化为com.example.testbinder.IBookManager的接口对象* 代码分析:如果客户端和服务端同进程,则返回服务端的Stub对象本身 否则返回封装后的Stub.Proxy对象*/public static com.example.testbinder.IBookManager asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}// 尝试从本地实现接口接收binder对象,如果得到的是null,你就需要从服务器端得到Binder对象,来转化成客户端所需的AIDL对象,即需要实例化proxy类来通过transact方法收集回调android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof com.example.testbinder.IBookManager))) {// 无需跨进程return ((com.example.testbinder.IBookManager) iin);}// 跨进程casereturn new com.example.testbinder.IBookManager.Stub.Proxy(obj);}//返回当前binder对象@Overridepublic android.os.IBinder asBinder() {return this;}// 运行在服务器端// onTransact只有当客户端和服务端不在同一个进程时才会调用// code代表请求类型 data中存放请求的参数,之后执行指定方法,// reply是服务器返回的结果,flags标明是否有返回值,0为有(双向),1为没有(单向),// 执行完毕向reply写入结果,如果有的话,return值代表返回成功或失败// 方法运行在服务端的binder线程池,客户端请求后通过底层代码将请求封装后交由该方法处理@Overridepublic boolean onTransact(int code, android.os.Parcel data,android.os.Parcel reply, int flags)throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_getBookList: {data.enforceInterface(DESCRIPTOR);java.util.List<com.example.testbinder.Book> _result = this.getBookList();reply.writeNoException();reply.writeTypedList(_result);return true;}case TRANSACTION_addBook: {data.enforceInterface(DESCRIPTOR);com.example.testbinder.Book _arg0;if ((0 != data.readInt())) {_arg0 = com.example.testbinder.Book.CREATOR.createFromParcel(data);} else {_arg0 = null;}this.addBook(_arg0);reply.writeNoException();return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implementscom.example.testbinder.IBookManager {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote = remote;}@Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}//运行在客户端,运行步骤如下//1创建输入型参数data和输出型参数reply,注意他们都是parcel类型的//2创建返回值对象result(如果有的话)//3将参数写入data(如果有参数)//4调用transact发起远程请求,接着当前线程挂起//5远程服务端的onTransact调用并返回结果//6挂起的线程继续执行,从reply中取出返回结果result(如果有的话),并返回result@Overridepublic java.util.List<com.example.testbinder.Book> getBookList()throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.util.List<com.example.testbinder.Book> _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getBookList, _data,_reply, 0);_reply.readException();_result = _reply.createTypedArrayList(com.example.testbinder.Book.CREATOR);} finally {_reply.recycle();_data.recycle();}return _result;}//执行过程和getBookList一样@Overridepublic void addBook(com.example.testbinder.Book book)throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);if ((book != null)) {_data.writeInt(1);book.writeToParcel(_data, 0);} else {_data.writeInt(0);}mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}}// 两个int值,用于标记调用的是哪个接口static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);}// 两个接口public java.util.List<com.example.testbinder.Book> getBookList()throws android.os.RemoteException;public void addBook(com.example.testbinder.Book book)throws android.os.RemoteException;
}
大家可以看下鸿洋大神相关的博客,他举了一个例子,非常好懂:
http://blog.csdn.net/lmj623565791/article/details/38461079/
Android艺术探索笔记 - 创建AIDL文件后自动生成的文件分析相关推荐
- 在WebStorm里配置watcher实现编辑less文件时自动生成.css文件
一.webstrom自动生成css文件 1.安装 nodejs //查看nodejs版本 node -v //查看npm版本 npm -v //全局安装less npm install ...
- less保存后自动生成css文件
vscode安装插件Easy LEss ,保存后自动编译,直接引用 css 文件即可
- Android笔记 Android艺术探索笔记 Pacel VS Serialize Demo
Serializable实体类 public class SeriaUser implements Serializable{/*** */private static final long seri ...
- java在src创建entity文件_java自动生成entity文件
private String packagePath = "com.qy.entity"; //指定实体生成所在包的路径//表名以","分隔;若为"* ...
- VFP6.0生成安装文件后显示“生成CAB文件时出错,错误号码:3”
其实这个问题很好解决 在点击工具-向导-安装之前,先把项目管理器关掉 这样就没有问题了
- 删除U盘文件夹后自动生成不同位数字的新文件夹
夹删除U盘文件后自动生成不同位数字的新文件夹解决方法 右键点击目录所在磁盘(C,D,E这种)的属性-选择工具-选择检查,系统自动修复文件系统错误. 如果U盘错误比较严重,修复的时间可能会比较久 然后在 ...
- Python创建文件时自动生成文件信息
Python创建文件时自动生成文件信息 在创建python脚本文件时,对文件初始化自动生成一些文件信息来进行设置 1 打开路径 2 调整面板 3 面板填写样式 参考链接 Pycharm创建文件时自动生 ...
- 自动生成PDF文件(Java通过PDF模板自动生成PDF)
思路: 1.创建PDF模板(先创建对应的excel文件,创建好后另存为PDF文件)即可. 2.使用Adobe Acrobat DC工具打开PDF文件,设置自己想要替换的内容. 3.maven项目引入依 ...
- 文件夹自动生成html画廊,【桌面自动生成文件夹】桌面自动生成网站_桌面自动生成tmp文件-系统城...
2017-01-26 13:59:36 浏览量:11190 有的用户发现自己的电脑系统中,总是会在桌面上生成一个名称为MobileFile的文件夹.其实,这个MobileFile文件夹是QQ相关的文件 ...
最新文章
- 中级实训第一天的自学报告
- 卡住无法查看到所有进程_进程同步 进程互斥 软件和硬件实现方式 信号量机制 信号量机制实现进程同步,进程互斥,前驱关系...
- jsp 页面中El表达式失效处理
- InputStream 、 InputStreamReader 、 BufferedReader区别
- QT的QDesignerPropertySheetExtension类的使用
- python grpc 并发_在Python中使用gRPC的方法示例【h】
- tensorflow3
- 一次FastDFS并发问题的排查经历
- android write file,Android Study Day 3 --Android File Read And Write
- merkle tree(hash tree)
- react-demo
- Raspberry install wine
- g++: command not found
- DDD领域驱动设计详解
- 银联支付证书下载及导出流程(带图)
- android 关闭软键盘失去焦点,Android edittext 点击其他处 失去焦点和关闭软键盘
- 上门洗车APP --- Androidclient开发 之 项目结构介绍
- 配置Oracle到MySQL透明网关
- 京东网站页面编写(HTML、CSS、JS),包括京东秒杀的倒计时、轮播图等功能
- 复利计算计算器_C程序计算复利