Binder框架

Binder是一種架構,包含服務端接口、Binder驅動、客戶端接口三個模塊。

Binder服務端,實際上就是一個Binder類的對象。該對象一旦創建,內部會啓動一個隱藏線程 ,該線程負責接收Binder驅動發送來的消息。

Binder驅動中包含一個Binder mRemote對象,在服務端對象創建時相應創建。
mRemote對象重載了transact(),實現了IPC通信:

1、向服務端線程發送調用消息

2、掛起當前線程,等待服務端執行完畢後的通知

3、接收到服務端線程的通知,然後執行客戶端的線程

應用程序客戶端想要訪問遠程服務,首先需要得到一個Binder對象。

如何獲取Binder對象?

Android的組件之一Service也是基於Binder來實現的,只是進行了一系列封裝,方便我們使用。接下我們就可以通過bindService()方法來獲取到Binder對象。

ContextImpl調用bindService()方法,ActivityManagerService會調用scheduleBindService(),接着回調ServiceConnection的OnBind()方法,將Binder對象傳遞給客戶端。

Binder對象有兩個,一個是服務端的,一個是Binder驅動中的,到底返回的是哪個呢?

如果客戶端和服務端在同一進程,則直接返回服務端中的Binder對象,否則返回Binder驅動中的Binder對象,由mRemote對象負責進程間的通信。


AIDL工具的使用

Android中提供了一個aidl工具,可能把aidl文件轉換成一個Java類文件。該Java類文件重載了transact()和onTransact()方法,將客戶端和服務端通信的方法都封裝好了。客戶端可以像使用其他普通類對象一樣調用服務端的方法。

AIDL具體實現的功能

1、定義了一個接口,包含aidl文件所聲明的通信函數

2、定義一個Proxy類,作爲客戶端訪問服務端的代理,實現好了寫入的方法

3、定義一個Stub類,基於Binder,重載了onTransact()方法,實現了取出的方法



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章