AIDL解析

实现

  1. 创建aidl文件

在build之后会在build目录生成IMyAidlInterface的实现类

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    int add(int aInt, int bInt);
    int min(int aInt, int bInt);
}

  1. 创建Service,并实现IMyAidlInterface.Stub()接口
    IMyAidlInterface.Stub stub = new IMyAidlInterface.Stub() {
        @Override
        public int add(int aInt, int bInt) {
            return aInt + bInt;
        }

        @Override
        public int min(int aInt, int bInt) {
            return aInt < bInt ? aInt : bInt;
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
  1. 在Activity中bindService
  bindService(intent, conn, Context.BIND_AUTO_CREATE);
private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iMyAidlInterface = null;
        }
    };

解析

服务端

transact [træn'zækt]

        @Override
        public boolean onTransact(int code, 
        android.os.Parcel data, 
        android.os.Parcel reply,
        int flags) throws android.os.RemoteException {
            ...
        }

可以看到onTransact有四个参数 code,data,replay,flags

  • code 是一个整形的唯一标识,用于区分执行哪个方法,客户端会传递此参数,告诉服务端执行哪个方法
  • data 客户端传递过来的参数
  • replay 服务器返回回去的值
  • flags 标明是否有返回值,0为有(双向),1为没有(单向)
data.enforceInterface(DESCRIPTOR);
与客户端的writeInterfaceToken对用,标识远程服务的名称

客户端

实际上调用了Proxy

       public static com.sanfen.aidl.IMyAidlInterface asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.sanfen.aidl.IMyAidlInterface))) {
                return ((com.sanfen.aidl.IMyAidlInterface) iin);
            }
            return new com.sanfen.aidl.IMyAidlInterface.Stub.Proxy(obj);
        }

最后通过transact方法传递给服务端的onTransact(),并在_reply中返回值

    mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);
    ==>
    onTransact(int code, android.os.Parcel data, android.os.Parcel reply,int flags)

源码

你可能感兴趣的:(AIDL解析)