在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文件后自动生成的文件分析相关推荐

  1. 在WebStorm里配置watcher实现编辑less文件时自动生成.css文件

    一.webstrom自动生成css文件 1.安装 nodejs     //查看nodejs版本  node -v //查看npm版本  npm -v //全局安装less  npm install ...

  2. less保存后自动生成css文件

    vscode安装插件Easy LEss ,保存后自动编译,直接引用 css 文件即可

  3. Android笔记 Android艺术探索笔记 Pacel VS Serialize Demo

    Serializable实体类 public class SeriaUser implements Serializable{/*** */private static final long seri ...

  4. java在src创建entity文件_java自动生成entity文件

    private String packagePath = "com.qy.entity"; //指定实体生成所在包的路径//表名以","分隔;若为"* ...

  5. VFP6.0生成安装文件后显示“生成CAB文件时出错,错误号码:3”

    其实这个问题很好解决 在点击工具-向导-安装之前,先把项目管理器关掉 这样就没有问题了

  6. 删除U盘文件夹后自动生成不同位数字的新文件夹

    夹删除U盘文件后自动生成不同位数字的新文件夹解决方法 右键点击目录所在磁盘(C,D,E这种)的属性-选择工具-选择检查,系统自动修复文件系统错误. 如果U盘错误比较严重,修复的时间可能会比较久 然后在 ...

  7. Python创建文件时自动生成文件信息

    Python创建文件时自动生成文件信息 在创建python脚本文件时,对文件初始化自动生成一些文件信息来进行设置 1 打开路径 2 调整面板 3 面板填写样式 参考链接 Pycharm创建文件时自动生 ...

  8. 自动生成PDF文件(Java通过PDF模板自动生成PDF)

    思路: 1.创建PDF模板(先创建对应的excel文件,创建好后另存为PDF文件)即可. 2.使用Adobe Acrobat DC工具打开PDF文件,设置自己想要替换的内容. 3.maven项目引入依 ...

  9. 文件夹自动生成html画廊,【桌面自动生成文件夹】桌面自动生成网站_桌面自动生成tmp文件-系统城...

    2017-01-26 13:59:36 浏览量:11190 有的用户发现自己的电脑系统中,总是会在桌面上生成一个名称为MobileFile的文件夹.其实,这个MobileFile文件夹是QQ相关的文件 ...

最新文章

  1. 中级实训第一天的自学报告
  2. 卡住无法查看到所有进程_进程同步 进程互斥 软件和硬件实现方式 信号量机制 信号量机制实现进程同步,进程互斥,前驱关系...
  3. jsp 页面中El表达式失效处理
  4. InputStream 、 InputStreamReader 、 BufferedReader区别
  5. QT的QDesignerPropertySheetExtension类的使用
  6. python grpc 并发_在Python中使用gRPC的方法示例【h】
  7. tensorflow3
  8. 一次FastDFS并发问题的排查经历
  9. android write file,Android Study Day 3 --Android File Read And Write
  10. merkle tree(hash tree)
  11. react-demo
  12. Raspberry install wine
  13. g++: command not found
  14. DDD领域驱动设计详解
  15. 银联支付证书下载及导出流程(带图)
  16. android 关闭软键盘失去焦点,Android edittext 点击其他处 失去焦点和关闭软键盘
  17. 上门洗车APP --- Androidclient开发 之 项目结构介绍
  18. 配置Oracle到MySQL透明网关
  19. 京东网站页面编写(HTML、CSS、JS),包括京东秒杀的倒计时、轮播图等功能
  20. 复利计算计算器_C程序计算复利

热门文章

  1. oracle select 变量_详解oracle数据库优化参数--cursor_sharing
  2. 4,GIL全局解释器锁,event事件,信号量
  3. 捕捉Web页面子类错误堆栈中的信息
  4. Shell脚本之七 选择、循环结构
  5. 注册表在各个系统中保存路径
  6. Ajax的XMLHttpRequest对象
  7. 对大脑有益的16种食物_对大脑有益的食物有哪些?
  8. java 中free,javac(freejava)
  9. 运维linux脚本实例,Shell脚本使用示例
  10. 记一次高io wait问题分析及解决-设置合理的SGA