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);
};