当创建AIDL文件并Clean Project 代码后,会生成相应的Java文件:

先来一段伪代码:类整体结构

/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: D:\\AndroidProject\\AIDLServerDemo\\app\\src\\main\\aidl\\cn\\zzw\\aidl\\IPerson.aidl
*/
package cn.zzw.aidl;
// Declare any non-default types here with import statements

public interface IPerson extends android.os.IInterface {
/**
* Local-side IPC implementation stub class.
*/
public static abstract class Stub extends android.os.Binder implements cn.zzw.aidl.IPerson //1
{
...
}

public java.lang.String sayHello(cn.zzw.aidl.PersonInfo personInfo) throws android.os.RemoteException; //2

public int sumnNum(int num1, int num2) throws android.os.RemoteException; //3
}
注释2 和注释3 就是我们在.aidl 中定义的方法。

注释1 是一个静态的抽象类,并且继承了Binder类。Binder是Android中实现IPC方式。AIDL就是利用Binder来实现的。

这里就不对于Binder进行解释,后面会对Binder的源码进行解读,再记录一篇关于Binder的原理。

看看Stub这个类:

public static abstract class Stub extends android.os.Binder implements cn.zzw.aidl.IPerson {
private static final java.lang.String DESCRIPTOR = "cn.zzw.aidl.IPerson";

/**
* Construct the stub at attach it to the interface.
*/
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}

/**
* Cast an IBinder object into an cn.zzw.aidl.IPerson interface,
* generating a proxy if needed.
*/
public static cn.zzw.aidl.IPerson asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof cn.zzw.aidl.IPerson))) {
return ((cn.zzw.aidl.IPerson) iin);
}
return new cn.zzw.aidl.IPerson.Stub.Proxy(obj);
}

@Override
public android.os.IBinder asBinder() {
return this;
}

@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
java.lang.String descriptor = DESCRIPTOR;
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(descriptor);
return true;
}
case TRANSACTION_sayHello: {
data.enforceInterface(descriptor);
cn.zzw.aidl.PersonInfo _arg0;
if ((0 != data.readInt())) {
_arg0 = cn.zzw.aidl.PersonInfo.CREATOR.createFromParcel(data);
} else {
_arg0 = null;
}
java.lang.String _result = this.sayHello(_arg0);
reply.writeNoException();
reply.writeString(_result);
return true;
}
case TRANSACTION_sumnNum: {
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
int _result = this.sumnNum(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
default: {
return super.onTransact(code, data, reply, flags);
}
}
}

private static class Proxy implements cn.zzw.aidl.IPerson {
private android.os.IBinder mRemote;

Proxy(android.os.IBinder remote) {
mRemote = remote;
}

@Override
public android.os.IBinder asBinder() {
return mRemote;
}

public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}

@Override
public java.lang.String sayHello(cn.zzw.aidl.PersonInfo personInfo) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.lang.String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((personInfo != null)) {
_data.writeInt(1);
personInfo.writeToParcel(_data, 0);
} else {
_data.writeInt(0);
}
mRemote.transact(Stub.TRANSACTION_sayHello, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}

@Override
public int sumnNum(int num1, int num2) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(num1);
_data.writeInt(num2);
mRemote.transact(Stub.TRANSACTION_sumnNum, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}

static final int TRANSACTION_sayHello = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_sumnNum = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
}
Stub类的类结构如下:

下面两个int常量是用来标识我们在接口中定义的方法的:

static final int TRANSACTION_sayHello = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_sumnNum = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
DESCRIPTOR 常量是Binder的唯一标识。

private static final java.lang.String DESCRIPTOR = "cn.zzw.aidl.IPerson";
 asInterface 方法非常熟悉,上面客户端才用到的,用于将服务端的Binder对象转换为客户端所需要的接口对象。该过程区分进程,如果进程一样,就返回服务端Stub对象本身,否则就返回封装后的Stub.Proxy对象。

public static cn.zzw.aidl.IPerson asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof cn.zzw.aidl.IPerson))) {
return ((cn.zzw.aidl.IPerson) iin);
}
return new cn.zzw.aidl.IPerson.Stub.Proxy(obj);
}
onTransact  方法是实现 Binder 类后重写的方法。这是运行在服务端的Binder线程中的,当客户端发起远程请求后,在底层的方法就会触发此方法。

最新文章

  1. Oracle学习笔记(1)----忘记用户名的密码该如何找回
  2. Code笔记之:CSS块级元素、内联元素概念
  3. PHP魔法方法的使用
  4. 关于 VS 无法转到定义和无法转到使用的问题
  5. Jsoup的demao
  6. 在SQL2005实现维护计划-备份数据库
  7. Android的Handler总结
  8. [转载]Python兵器谱
  9. BZOJ [JSOI2008]魔兽地图DotR
  10. android_重写button样式
  11. 使用 Kafka 和 ELK 搭建测试日志系统(1)
  12. 轨迹系列4——WebGIS中使用ZRender实现轨迹前端动态播放特效
  13. slim.arg_scope中python技巧
  14. scrapy(网络爬虫)———CrawlSpider(规则爬虫)
  15. jquery easyui datagrid 加每页合计和总合计
  16. 关于npm 淘宝镜像 以及package.json里包的更新
  17. Ubuntu卸载软件
  18. Qt 使用QMovie加载gif图片实现动态等待窗口
  19. 理解-const
  20. linux mail 发送邮件附件

热门文章

  1. 【科创人上海行】Tinyfool郝培强 :始于不惑的微服务式创业,背负身心病痛贴地飞行
  2. js之数据类型(对象类型——构造器对象——函数1)
  3. tensorflow-解决3个问题
  4. Hadoop2.7.3集群安装scala-2.12.8 和spark2.7
  5. Phoenix批量提交优化,官网的demo
  6. MySQL添加唯一索引
  7. iptables实现内外网端口映射及转发上网
  8. redis 的启动、关闭 判断其是否在运行中
  9. java——比较难和底层的面试题
  10. Spring事务源码分析