天天看點

Android Binder Analysis(4)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檔案中有如下接口:

Android Binder Analysis(4)Android Binder Analysis(4)

Book前面有一個in,就像資料類型一樣的标記,那麼這個東東是幹什麼的呢?這裡的in被叫做定向标記,對于非基本類型的資料我們必須使用in指定其資料流向,一共有三種标記可以使用:in,out,inout。

那麼什麼叫資料流向呢?資料流向指的是什麼?可不可以當作輸入流和輸出流來了解?

我們寫一個demo來測試一下:

首先修改BookManager.aidl如下:

Android Binder Analysis(4)Android Binder Analysis(4)

随後在服務端(BookManagerService.java)中添加實作函數:

Android Binder Analysis(4)Android Binder Analysis(4)

用戶端調用該函數:

Android Binder Analysis(4)Android Binder Analysis(4)

随後重新啟動用戶端和伺服器,執行結果如下:

Android Binder Analysis(4)Android Binder Analysis(4)
Android Binder Analysis(4)Android Binder Analysis(4)
Android Binder Analysis(4)Android Binder Analysis(4)

通過上述執行結果我們可以看到out标記修飾的Book并沒有将屬性值傳遞到伺服器,反而用戶端和伺服器的屬性值均被修改為null.是以,我們不妨大膽猜想,這裡的In Out标記并不是指的單純流向,而應該指的是資料的相對流向:

  in表示資料流是從用戶端傳入對象流向伺服器的

  out表示資料流是從伺服器流入用戶端傳入對象的

  inout指的是針對傳入對象雙向傳遞

我們再次修改伺服器代碼以驗證上述猜想:

Android Binder Analysis(4)Android Binder Analysis(4)

執行後的結果如下:

Android Binder Analysis(4)Android Binder Analysis(4)

上述運作結果充分驗證我們的猜想是完全正确的,對于out TAG型的變量而已,其不會傳遞用戶端任何屬性值到伺服器,其屬性值完全受伺服器操作影響,伺服器修改其值,用戶端同時發生改變

在AIDL開發中,所有的非基本參數都需要一個定向TAG來指出資料流

通的方式,基本參數的定向TAG預設是并且隻能是 in,其中 in 表示資料隻能由用戶端流向服務端, out 表示資料隻能由服務端流向用戶端,而 inout 則表示資料可在服務端與用戶端之間雙向流通。其中,資料流向是針對在用戶端中傳入的對象而言的。in 為定向 TAG的話表現為服務端将會接收到一個那個對象的完整資料,但是用戶端的那個對象不會因為服務端對傳參的修改而發生變動;out 的話表現為服務端将會接收到那個對象的參數為空的對象,但是在服務端對接收到的空對象有任何修改之後用戶端将會同步變動;inout 為定向 TAG的情況下,服務端将會接收到用戶端傳來對象的完整資訊,并且用戶端将會同步服務端對該對象的任何變動.

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

最新文章更新在微信公衆号上,歡迎關注擷取詳情:

Android Binder Analysis(4)Android Binder Analysis(4)

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