1. 程式人生 > >Binder常用方法介紹

Binder常用方法介紹

1.DESCRIPTOR
Binder的唯一標識,一般用Binder的類名錶示

2.asInterface(android.os.IBinder obj)
將服務端的物件轉換成客戶端的AIDL介面型別的物件,這種轉換過程是區分程序的,如果客戶端和服務端在同一程序,那麼此方法返回的是服務端的Stub物件本身,否則返回的是系統封裝後的Stub.proxy物件

3.asBinder
此方法返回當前Binder物件

4.onTransact
此方法執行在服務端的Binder執行緒池中當客戶端發起跨程序請求時,會通過系統底層封裝後交由此方法處理。服務端通過code可以確定客戶端所請求的目標方法是什麼,然後從data中取出目標方法所需的引數,再執行目標方法,執行完畢後,就向reply中寫入返回的值(如果方法有返回值),返回false那麼客戶端會請求失敗

5.AIDL支援的資料型別
基本資料型別、String和CharSequence、ArrayList、HashMap、Parcelable、AIDL
注意:如果AIDL檔案中用到了自定義的Parcelable物件,那麼必須新建一個和它同名的AIDL檔案,並在其中宣告它為parcelable型別(例如: parcelable Book),除此之外,AIDL中除了基本型別,其它型別的引數必須標上方向:in(輸入型引數)、out(輸出型引數)或者inout(輸入輸出型引數)
例如(void addBook(in Book book);),最後非常重要的一點就是讀取序列化物件要按照寫入的順序讀取

6.遠端服務端Service的實現
建立Service
建立一個Binder物件並在onBind中返回
(例如: Binder mBinder = new IBookManager.Stub(){} )、CopyOnWriteArrayList和ConcurrentHashMap(支援併發讀寫)
XML中註冊這個Service,因為這個Service是執行在獨立的程序,它和客戶端的Activity不在同一個程序中,這樣就構成了程序間通訊的場景。
(Service新增:android:process=”:remote”)

7.客戶端的實現
繫結遠端服務,繫結成功後將服務端返回的Binder物件轉換成AIDL介面,然後通過這個介面取呼叫服務端的遠端方法
繫結服務

// 繫結服務
Intent intent = new Intent(this, BookManagerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

解綁服務

unbindService(mConnection);

遠端服務介面

private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 服務斷開連線

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 獲取
            IBookManager bookManager = IBookManager.Stub.asInterface(service);

    };