5、Stub.onTransact 方法
onTransact 方法用于处理不同的 IPC 请求 , 根据不同的值 , 处理不同的 IPC 请求 ;
要处理的 IPC 请求对应的常量值定义 : 将要调用的方法变成 int 类型的 ID 常量值 , 根据传入的常量值执行相应的方法 , 方便 IPC 跨进程调用 ;
static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_addStudent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); static final int TRANSACTION_getStudents = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
TRANSACTION_basicTypes 常量值对应如下 AIDL 方法 :
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);
TRANSACTION_addStudent 常量值对应如下 AIDL 方法 :
/** * in 写入, out 输出, inout 写入和输出 */ void addStudent(inout Student student);
TRANSACTION_getStudents 常量值对应如下 AIDL 方法 :
/** * 获取 Student 集合 */ List<Student> getStudents();
Stub.onTransact 方法代码内容 :
@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_basicTypes: { data.enforceInterface(descriptor); int _arg0; _arg0 = data.readInt(); long _arg1; _arg1 = data.readLong(); boolean _arg2; _arg2 = (0!=data.readInt()); float _arg3; _arg3 = data.readFloat(); double _arg4; _arg4 = data.readDouble(); java.lang.String _arg5; _arg5 = data.readString(); this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); reply.writeNoException(); return true; } case TRANSACTION_addStudent: { data.enforceInterface(descriptor); kim.hsl.aidl_demo.Student _arg0; if ((0!=data.readInt())) { _arg0 = kim.hsl.aidl_demo.Student.CREATOR.createFromParcel(data); } else { _arg0 = null; } this.addStudent(_arg0); reply.writeNoException(); if ((_arg0!=null)) { reply.writeInt(1); _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } return true; } case TRANSACTION_getStudents: { data.enforceInterface(descriptor); java.util.List<kim.hsl.aidl_demo.Student> _result = this.getStudents(); reply.writeNoException(); reply.writeTypedList(_result); return true; } default: { return super.onTransact(code, data, reply, flags); } } }
主要分析 TRANSACTION_addStudent 方法 : kim.hsl.aidl_demo.Student 类中 , 实现了序列化与反序列化的方法 , 这里传递参数时 , _arg0 = kim.hsl.aidl_demo.Student.CREATOR.createFromParcel(data) , 调用了 Student 类的反序列化方法 , 将参数先进行反序列化 , 然后赋值给 arg0 , 这样才能得到 Student 类型对象 ;
调用 this.addStudent(_arg0); 代码执行该方法 , 然后通过返回参数 replay , 将结果写回给调用者用户空间进程 ;
case TRANSACTION_addStudent: { data.enforceInterface(descriptor); kim.hsl.aidl_demo.Student _arg0; if ((0!=data.readInt())) { _arg0 = kim.hsl.aidl_demo.Student.CREATOR.createFromParcel(data); } else { _arg0 = null; } this.addStudent(_arg0); reply.writeNoException(); if ((_arg0!=null)) { reply.writeInt(1); _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } return true; }
6、Stub.Proxy 代理类
Stub 类有一个内部 Proxy 代理类 , 只有当前服务非本地服务 , 即跨进程远程服务时 , 才会使用这个类 ;
private static class Proxy implements kim.hsl.aidl_demo.IMyAidlInterface
在代理类中也需要 AIDL 描述符 , 在 getInterfaceDescriptor 方法中 , 传入 DESCRIPTOR 描述符 ;
public java.lang.String getInterfaceDescriptor() { return DESCRIPTOR; }