Android Binder Analysis(4)

Android Binder Analysis(4)

@(數據庫系統)[Binder, AIDL, Messenger]

上篇博文中我們以AIDL爲核心,簡單介紹了AIDL同步類型項目的基本開發流程,並總結了AIDL開發中的M3T,即:

  • MUST:Package Name Of JAVA Bean MUST Be Same To AIDL
  • MUST:AIDL File Of Client MUST Be Same To Server
  • MUST:Non Primitive type MUST implement Parcelable Interface
  • TAG:Directional TAG For Non-primitive Parameters

接下來我們緊接上篇博文的話題,來介紹M3T中的T(定向TAG).

或許細心的朋友已經發現了,在上篇的demo中,我們編寫的BookManager.aidl文件中有如下接口:
這裏寫圖片描述

Book前面有一個in,就像數據類型一樣的標記,那麼這個東東是幹什麼的呢?這裏的in被叫做定向標記,對於非基本類型的數據我們必須使用in指定其數據流向,一共有三種標記可以使用:in,out,inout
那麼什麼叫數據流向呢?數據流向指的是什麼?可不可以當作輸入流和輸出流來理解?
我們寫一個demo來測試一下:
首先修改BookManager.aidl如下:
這裏寫圖片描述
隨後在服務端(BookManagerService.java)中添加實現函數:
這裏寫圖片描述
客戶端調用該函數:
這裏寫圖片描述
隨後重新啓動客戶端和服務器,執行結果如下:
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
通過上述執行結果我們可以看到out標記修飾的Book並沒有將屬性值傳遞到服務器,反而客戶端和服務器的屬性值均被修改爲null.因此,我們不妨大膽猜想,這裏的In Out標記並不是指的單純流向,而應該指的是數據的相對流向:
  in表示數據流是從客戶端傳入對象流向服務器的
  out表示數據流是從服務器流入客戶端傳入對象的
  inout指的是針對傳入對象雙向傳遞
我們再次修改服務器代碼以驗證上述猜想:
這裏寫圖片描述
執行後的結果如下:
這裏寫圖片描述
上述運行結果充分驗證我們的猜想是完全正確的,對於out TAG型的變量而已,其不會傳遞客戶端任何屬性值到服務器,其屬性值完全受服務器操作影響,服務器修改其值,客戶端同時發生改變
在AIDL開發中,所有的非基本參數都需要一個定向TAG來指出數據流
通的方式,基本參數的定向TAG默認是並且只能是 in,其中 in 表示數據只能由客戶端流向服務端, out 表示數據只能由服務端流向客戶端,而 inout 則表示數據可在服務端與客戶端之間雙向流通。其中,數據流向是針對在客戶端中傳入的對象而言的。in 爲定向 TAG的話表現爲服務端將會接收到一個那個對象的完整數據,但是客戶端的那個對象不會因爲服務端對傳參的修改而發生變動;out 的話表現爲服務端將會接收到那個對象的參數爲空的對象,但是在服務端對接收到的空對象有任何修改之後客戶端將會同步變動;inout 爲定向 TAG的情況下,服務端將會接收到客戶端傳來對象的完整信息,並且客戶端將會同步服務端對該對象的任何變動.

至此我們就完成了AIDL同步方式demo的學習,接下來我們將會介紹AIDL異步回調行爲的實現,敬請期待。

最新文章更新在微信公衆號上,歡迎關注獲取詳情:
這裏寫圖片描述


感謝閱讀這份博文。轉載請註明出處:小海窩

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