對AIDL和Binder的理解
AIDL只是方便開發者使用Binder的“工具”,Binder是用來跨程式呼叫的。如果沒有AIDL,自己寫Binder實現跨程式通訊還是挺麻煩的,而且都是重複性的程式碼。
服務端:
會有一個Binder子類Stub的例項,Stub需要繼承Binder,重寫onTransact方法。這個Binder例項接受遠端請求,進入onTransact方法處理,在onTransact中是需要能呼叫具體處理程式碼,其實通過組合的方式也是可以的,Binder中擁有IBookManager的例項,不過AIDL中是通過繼承的方式實現的,具體看Stub類。
需要說明的是:一個Binder例項是需要能查詢自己是否關聯一個IInterface的,IBookManager實現了IInterface,其實就是看Binder是否關聯一個業務介面。查詢介面是在IBinder中定義的IInterface queryLocalInterface(String descriptor)
。在Binder中提供了一個方法attachInterface
把IInterface存入Binder中。(在這裡學習到了一個程式設計思想:IBinder中只定義了查詢介面,沒有定義放入介面,說明只讓外部使用者查詢,讓子類建立者解決怎麼放)
為啥要讓Binder有查詢是否關聯一個IInterface的能力呢?
這是因為客戶端也是有個Binder的,如何知道這個Binder表示的是本地的還是遠端的,只需要查詢一下Binder是否關聯一個業務介面,如果關聯,說明是本地Binder直接返回這個介面,如果沒有關聯一個業務介面,說明是一個遠端Binder,我們需要代理Proxy來包裝一下遠端Binder,讓客戶端能直接操作業務介面一樣的使用IPC。這塊內容看一下Stub的public static com.lzy.learnpro.IBookManager asInterface(android.os.IBinder obj)
。
再說一個IIterface
這個介面很簡單
/**
* Base class for Binder interfaces. When defining a new interface,
* you must derive it from IInterface.
*/
public interface IInterface
{
/**
* Retrieve the Binder object associated with this interface.
* You must use this instead of a plain cast, so that proxy objects
* can return the correct result.
*/
public IBinder asBinder();
}
其實就是讓因為介面能返回相關聯的Binder。在服務端返回的就是本地Binder,看Stub原始碼,在客戶端返回的就是遠端Binder,看Proxy原始碼。
Service和Binder的關係
AIDL只是方便使用Binder,也可以不用AIDL。在IPC的時候是需要使用Service的,通過啟動後Service才能獲取到遠端Binder,這樣就可以通訊了。不過還是使用AIDL更方便些,客戶端啟動繫結Service後在onServiceConnected獲取到Binder,通過Stub的asInterface能很簡單的轉化成對應的業務介面,具體看上面的分析。
客戶端
客戶端就很簡單了,繫結Service後,獲取一個Binder,通過Stub的asInterface把Binder轉化成業務介面,這樣就可以通訊了。
相關文章
- 藉助 AIDL 理解 Android Binder 機制——AIDL 的使用和原理分析AIAndroid
- 藉助 AIDL 理解 Android Binder 機制——Binder 來龍去脈AIAndroid
- 自己對Binder的理解
- Binder機制之AIDLAI
- 【Android原始碼】Binder機制和AIDL分析Android原始碼AI
- Binder + AMS + AIDL大雜燴AI
- Android aidl Binder框架淺析AndroidAI框架
- Binder學習(三)通過AIDL分析Binder通訊流程AI
- Binder學習(四)利用AIDL、Messenger實現IPCAIMessenger
- binder核心原理解析
- android-IPC/Binder/D-BUS(Binder/Messager/AIDL)程式間通訊(訊息機制)AndroidAI
- 從Activity的啟動流程理解Binder
- Android系統服務編寫例項-Binder(Java層AIDL)AndroidJavaAI
- 從AIDL開始談Android程式間Binder通訊機制AIAndroid
- 換個角度理解Android的AIDL原理AndroidAI
- 對session和cookie的理解SessionCookie
- 月薪不同的三人去面試,面試官問道:各自談談對 binder 的理解?面試
- 理解 Android Binder 機制(三):Java層AndroidJava
- Binder機制分析(2)——從MediaService中看Binder的實現和使用(1)
- Binder機制分析(2)——從MediaService中看Binder的實現和使用(2)
- [深入理解Android卷二 全文-第二章]深入理解Java Binder和MessageQueueAndroidJava
- 我對部落格的理解和看法
- 對與locale和resourceBundle的理解
- 理解 Android Binder 機制(二):C++層AndroidC++
- 理解 Android Binder 機制(一):驅動篇Android
- 徹底理解 Android Binder 通訊架構Android架構
- Binder的使用方法和原始碼解析原始碼
- 我對遞迴的理解和總結遞迴
- 談談對MVC、MVP和MVVM的理解?MVCMVPMVVM
- 對javascript中的call()和apply()的理解JavaScriptAPP
- AIDL的基本使用AI
- 對MVP、Flux和RxAndroid框架的理解和選擇MVPUXAndroid框架
- 對淺拷貝和深拷貝的理解
- Qt中對js和HTML通訊的理解QTJSHTML
- 個人對持續整合的理解和實踐
- 對vue原始碼的初步認識和理解Vue原始碼
- 對於最近的一些理解和思考
- java學習中對類和物件的理解Java物件