天天看點

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()方法,實作了取出的方法