美文网首页
AIDL解析

AIDL解析

作者: sanfen | 来源:发表于2019-08-06 19:56 被阅读0次

    实现

    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解析

          本文链接:https://www.haomeiwen.com/subject/uefgdctx.html