Binder 機(jī)制-分析記錄



//Aidl 需要聲名 導(dǎo)入 引用類。與JAVA 機(jī)制不同
// Declare any non-default types here with import statements

public interface IBookManager extends android.os.IInterface {

    /**
     * 聲明IBookManager.aidl 中 自定義的方法
     */
    public java.util.List<com.rango.ipc.Book> getBookList() throws android.os.RemoteException;
    public void addBook(com.rango.ipc.Book book) throws android.os.RemoteException;

    /**
     * 聲明兩個(gè) id 標(biāo)識 transact 過程中 客戶端請求的方法名稱
     */
    static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);


    /**
     * 聲明 一個(gè)Binder 類
     */
    public static abstract class Stub extends android.os.Binder implements com.rango.ipc.IBookManager {

        /**
         * Binder 的唯一標(biāo)識,作為Binder類名標(biāo)識
          */
    private static final String DESCRIPTOR = "com.rango.ipc.IBookManager";

    public Stub() {

    this.attachInterface(this, DESCRIPTOR);

    }

        /**
         * 用于講服務(wù)端的Binder 對象轉(zhuǎn)換成客戶端所需要的Aidl 接口類型對象
         */
    public static com.rango.ipc.IBookManager asInterface(android.os.IBinder obj) {
        if ((obj==null)) {
            return null;
        }
        android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
        /**  如果客戶端與 服務(wù)端 處在同一進(jìn)程,那么返回服務(wù)端的Sub 對象。*/
        if (((iin!=null)&&(iin instanceof com.rango.ipc.IBookManager))) {
            return ((com.rango.ipc.IBookManager)iin);
        }
        /** 否則返回 Stub.proxy 對象 */
          return new com.rango.ipc.IBookManager.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 {
            String descriptor = DESCRIPTOR;
            switch (code){
                case INTERFACE_TRANSACTION: {
                      reply.writeString(descriptor);
                      return true;
                }

                case TRANSACTION_getBookList: {
                        data.enforceInterface(descriptor);
                        java.util.List<com.rango.ipc.Book> _result = this.getBookList();
                        reply.writeNoException();
                        reply.writeTypedList(_result);
                         return true;
                }

                case TRANSACTION_addBook: {
                        data.enforceInterface(descriptor);
                        com.rango.ipc.Book _arg0;
                        if ((0!=data.readInt())) {
                                _arg0 = com.rango.ipc.Book.CREATOR.createFromParcel(data);
                         }  else {
                                _arg0 = null;
                        }

                        this.addBook(_arg0);
                        reply.writeNoException();
                         return true;
                  }

            default: {
                    return super.onTransact(code, data, reply, flags);
                       }
             }
        }

        /**
         * Binder 內(nèi)部代理類。由客戶端創(chuàng)建并使用
          */
    private static class Proxy implements com.rango.ipc.IBookManager {
            private android.os.IBinder mRemote;
            Proxy(android.os.IBinder remote) {
                    mRemote = remote;
            }
            @Override
            public android.os.IBinder asBinder() {
                    return mRemote;
            }
            public String getInterfaceDescriptor() {
                    return DESCRIPTOR;
            }
            @Override
            public java.util.List<com.rango.ipc.Book> getBookList() throws android.os.RemoteException {
                /** 創(chuàng)建 輸入 和 輸入的 Parcel 對象 */
                    android.os.Parcel _data = android.os.Parcel.obtain();
                    android.os.Parcel _reply = android.os.Parcel.obtain();
                    java.util.List<com.rango.ipc.Book> _result;
                    try {
                        _data.writeInterfaceToken(DESCRIPTOR);
                        /**
                         * 調(diào)用 transact 進(jìn)行RPC(遠(yuǎn)程過程調(diào)用) 掛起當(dāng)前線程(即客戶端線程??!如果在UI線程請求,而服務(wù)端執(zhí)行耗時(shí)操作,此時(shí)等于是讓UI線程陷入等待)。然后服務(wù)端的onTransact 會被調(diào)用。
                         */
                        mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);
                        _reply.readException();
                        /** 取出RPC 過程的返回結(jié)果 */
                        _result = _reply.createTypedArrayList(com.rango.ipc.Book.CREATOR);
                    } finally {
                            _reply.recycle();
                            _data.recycle();
                    }
                        return _result;
            }

            @Override
            public void addBook(com.rango.ipc.Book book) throws android.os.RemoteException {
                        android.os.Parcel _data = android.os.Parcel.obtain();
                        android.os.Parcel _reply = android.os.Parcel.obtain();
                        try {
                            _data.writeInterfaceToken(DESCRIPTOR);
                            if ((book!=null)) {
                                    _data.writeInt(1);
                                    book.writeToParcel(_data, 0);
                            } else {
                                    _data.writeInt(0);
                            }
                        mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);
                        _reply.readException();
                        } finally {
                            _reply.recycle();
                            _data.recycle();
                        }
                }
        }//end Proxy


    }//end Stub

}


END

參考:《Android 開發(fā)藝術(shù)探索》
拓展使用:利用Binder機(jī)制 實(shí)現(xiàn)客戶端與服務(wù)端 雙向通信

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容