Android基礎——初學者必知的AIDL在應用程式層上的Binder機制

來源:互聯網
上載者:User

標籤:服務端   擷取   fill   基於   預設   跨進程通訊   編譯   實現   出現   

初學者必知的AIDL在應用程式層上的Binder機制

 

首先得理解幾個概念:

IPC:Inter-Process Communication,進程間的通訊或跨進程通訊。簡單點理解,一個應用可以存在多個進程,但需要資料交換就必須用IPC;或者是二個應用之間的資料交換。

Binder:Binder是Android的一個類,它實現了IBinder介面。從IPC角度來說,Binder是Android中的一種跨進程通訊方式。通過這個Binder對象,用戶端就可以擷取服務端提供的服務或資料,這裡的服務包括普通服務和基於AIDL的服務。

AIDL:Android Interface Definition language,它是一種Android內部進程通訊介面的描述語言。

 

 

一、AIDL的使用

 

 

服務端:

建立一個服務端工程,在工程中點擊右鍵New->AIDL->AIDL File,預設直接點確定,這時會在工程中出現一個aidl檔案:

我們開啟這個aidl檔案,我們建立一個我們需要測試的方法:

由於Android Studio是要手動編譯才能產生對應AIDL的java檔案,既然aidl檔案是個介面,那就必須存在著實現這個介面的類,點擊編譯,系統自動產生一個java類,該java類的代碼就是整個Binder機制的原理所在(會在下面第二步驟介紹原理):

 

既然是個服務端,那麼我們就要開始寫服務了,建立一個類,繼承Service:


 

既然是個服務,就必須在manifests檔案中配置:

 


到現在服務端寫好了,開啟模擬器啟動這個程式,記得在代碼中開啟服務:

 

 


 

 

用戶端:

 

在工程中點擊右鍵New->Module,按預設確定,finish:


關鍵的一步來了,複製服務端的aidl整個檔案夾(包括裡面的包、aidl檔案、完整無缺)粘貼到用戶端對應放aidl的地方


不要忘了,用戶端還要手動編譯

好了我們來寫用戶端的代碼(我們在MainActivity中放一個”AIDL“的按鈕,先綁定服務,然後點擊按鈕調用):

 


 

測試結果(先開啟服務端,開啟服務後,接著開啟用戶端,綁定遠程服務):

 




 

二、AIDL的Binder機制原理分析

 

分析原理:

 


 

我們來分析一下這個類

首先本身繼承Iinterface,所以他也是個介面,介面中必須有方法,代碼定位到結尾有2個方法。

 


這兩個方法就是basicTypes和add,就是我們服務端的2個方法。

 

接著發現該介面中有1個內部類Stub,繼承自本身(IMyAidlInterface)介面,代碼定位到Stub類。

這個Stub有個構造方法、asInterface、asBinder、onTransact(先不介紹)。

接著發現該內部類Stub還有一個內部類,代碼定位到Proxy(我們把它稱為代理)類,也是繼承自本身(IMyAidlInterface)介面,所以實現該介面的兩個方法。

 


在這個類裡面我們會發現有2個標識:用來區分兩個方法,到底你遠程請求哪個方法的唯一標識,代碼定位到代理類的結尾

 

 


回過頭來,還記得我們用戶端做了什麼嗎?答案:綁定一個服務,在回調方法擷取一個介面(iMyAidlInterface),它是直接靜態使用IMyAidlInterface裡面的靜態類Stub的asInterface的方法:(雅思高分作文好了我們去跟蹤到Stub類asInterface這個方法)

 

 


代碼定位到Stub類asInterface方法

 

 


前面只是做一些判斷、看一下最後一句話:我們將傳過來的obj還是傳給了它的代理類來處理,返回的是代理類的對象

 

 


所以在用戶端的iMyAidlInterface=……,則是拿到它的代理類,好了,這個時候就看用戶端調用代理類幹嘛了

 

 


他調用了代理類的add方法,代碼定位到代理類的add方法


你會發現,它把資料寫進了_data裡面,最後調用transact方法,傳入_data資料,唯一標識Stub.TRANSACTION_add。

 

 


然後這個transact方法就是通過底層了,通過底層結束後,這些參數送到哪了?答案:底層會走到stub類中的onTransact方法,通過判斷唯一標識,確定方法:


在這個地方將傳過來的參數解包,readInt方法。然後調用this.add方法,this指的就是服務端,調用服務端的add的方法:

 

 


將得到的結果,寫入reply

 

 


最後一句話,最後返回系統的ontransact方法,傳入結果reply:

 

 


所以我們在上面獲得的結果就是reply(答案:3):

 

 


最後總結下整個過程



三、AIDL編寫時候的一些錯誤

 

錯誤一:

 


這個錯誤很有可能是你寫的服務端,忘記返回myS了,返回的是個null

 

 


錯誤二:

 


這個錯誤很有可能是的服務端在manifests檔案中少了exported="true"的屬性 

Android基礎——初學者必知的AIDL在應用程式層上的Binder機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.