標籤:服務端 擷取 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機制