这个IPeopleManager 继承了IInterface,明显是用来IPC的,而IInterface里方法asBinder()由内部类实现,而我们在aidl里定义的四个方法,就放在这个接口里
public interface IPeopleManager extends android.os.IInterface
这个接口有一个静态内部类,Stub。它是抽象类,继承于Binder,实现了外面的接口IPersonManagerInterface
public static abstract class Stub extends android.os.Binder implements com.example.aidl.IPeopleManager
而Stub也有一个静态内部类,叫做Proxy,但只是实现了外层的接口
private static class Proxy implements com.example.aidl.IPeopleManager
Stub
Stub是工作在aidl进程的(我们的Service实例化了一个Stub,所以我们的aidl进程就是Service进程)
public static abstract class Stub extends android.os.Binder implements com.example.aidl.IPeopleManager { private static final java.lang.String DESCRIPTOR = "com.example.aidl.IPeopleManager"; /** Construct the stub at attach it to the interface. */ public Stub() { this.attachInterface(this, DESCRIPTOR); } /** * Cast an IBinder object into an com.example.aidl.IPeopleManager interface, * generating a proxy if needed. */ // 我们在onServiceConnected()方法中,就是用这个asInterface()方法,来把Service的onBind()返回的IBinder对象转化为Stub对象或Proxy对象 public static com.example.aidl.IPeopleManager asInterface(android.os.IBinder obj) { if ((obj==null)) { return null; } // 寻找本地Stub接口,也就是当前进程的Stub接口 android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); // 如果找到了,就表示和aidl是在一个进程里 // 否则,就不是一个进程里,比如Client if (((iin!=null)&&(iin instanceof com.example.aidl.IPeopleManager))) { // 在一个进程里,返回的是Service类里的Stub对象 return ((com.example.aidl.IPeopleManager)iin); } // 不在一个进程里,就返回一个Proxy,所以Client获取的是proxy // 传入的参数,就是Service的onBind()方法返回值 return new com.example.aidl.IPeopleManager.Stub.Proxy(obj); } @Override public android.os.IBinder asBinder() { return this; } // 此方法仅用于ipc,如果是一个进程里用不到 @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_getAge: { data.enforceInterface(descriptor); int _result = this.getAge(); reply.writeNoException(); reply.writeInt(_result); return true; } case TRANSACTION_getName: { data.enforceInterface(descriptor); java.lang.String _result = this.getName(); reply.writeNoException(); reply.writeString(_result); return true; } case TRANSACTION_addPeople: { data.enforceInterface(descriptor); com.example.aidl.People _arg0; if ((0!=data.readInt())) { _arg0 = com.example.aidl.People.CREATOR.createFromParcel(data); } else { _arg0 = null; } this.addPeople(_arg0); reply.writeNoException(); return true; } case TRANSACTION_getPeople: { data.enforceInterface(descriptor); com.example.aidl.People _result = this.getPeople(); reply.writeNoException(); if ((_result!=null)) { reply.writeInt(1); _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } return true; } case TRANSACTION_updatePeople: { data.enforceInterface(descriptor); com.example.aidl.People _arg0; _arg0 = new com.example.aidl.People(); com.example.aidl.People _result = this.updatePeople(_arg0); reply.writeNoException(); if ((_result!=null)) { reply.writeInt(1); _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } if ((_arg0!=null)) { reply.writeInt(1); _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } return true; } case TRANSACTION_updatePeople2: { data.enforceInterface(descriptor); com.example.aidl.People _arg0; if ((0!=data.readInt())) { _arg0 = com.example.aidl.People.CREATOR.createFromParcel(data); } else { _arg0 = null; } com.example.aidl.People _result = this.updatePeople2(_arg0); reply.writeNoException(); if ((_result!=null)) { reply.writeInt(1); _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } if ((_arg0!=null)) { reply.writeInt(1); _arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeInt(0); } return true; } default: { return super.onTransact(code, data, reply, flags); } } }
如果调用方和aidl在一个进程里,asInterface()获取到的就是Service.onBind()方法的返回结果,调用的就是Service里的Stub的方法,再加上同一进程用的是同一块内存空间,所以才导致in、out、inout没了实际作用
Proxy是IPC时,工作在调用方进程的,通过IBinder.transact()方法调用aidl进程的Stub.onTransact()方法