1. 程式人生 > >一步步揭開AIDL的神祕面紗

一步步揭開AIDL的神祕面紗

前言

在我心中AIDL一直是個神祕的存在,它就像武俠世界中的上乘內功心法,讓我這個只會點三腳貓功夫的人一直敬而遠之!雖然說在平時開發中確實很少使用AIDL,但是它在面試中出現的頻率還是相當高的,況且想要成為一名合格的Android開發人員,是無法避開AIDL的。最近又拿起了《Android開發藝術探索》這本書,看到了“IPC機制”這個章節,就借這個機會徹底揭開AIDL的神祕面紗,看看它究竟是何方神聖吧!

正文

一、什麼是AIDL?

Android Interface Definition Language 直譯:Android介面定義語言。

是 Android 提供的一種程序間通訊 (IPC) 機制,通過這種機制,我們只需要寫好aidl介面檔案,編譯時系統會幫我們生成Binder介面,此時我們就可以通過Binder去輕鬆實現程序之間傳值或者呼叫方法啦。

二、為什麼要使用AIDL?

我們都知道Android對單個應用是有記憶體限制的,當有需求需要突破這個限制的時候,我們需要另啟程序擴大記憶體,而兩個程序是完全獨立的,此時AIDL是一種很有效的解決程序間通訊的方式;再比如說,某些情況下遠端的服務更適合運算或者更適合執行耗時操作,這時候我們會使用AIDL請求遠端服務等等。

三、AIDL支援哪些資料型別?

1、基本資料型別(int、long、char、boolean、double等);

2、String和CharSequence;

3、List 和 Map 

  • 元素必須是AIDL支援的資料型別
  • 必須是 ArrayList 或者 HashMap

4、所有實現了Parcelable介面的物件;

5、所有的AIDL介面

四、如何使用AIDL?

1、建立AIDL介面:

  • 建立一個字尾為AIDL的檔案
  • 在檔案中宣告一個介面和所需要的介面方法

2、建立服務端:

  • 建立Service來監聽客戶端的連線請求
  • 在Service中實現第一步建立的AIDL介面

3、建立客戶端:

  • 繫結服務端的Service
  • 將服務端返回的Binder物件轉換成AIDL介面所屬的型別

五、需要注意什麼?

1、在AIDL中每個實現了Parcelable介面的類,都需要建立相應的AIDL檔案(刪除所有預設生產的程式碼,替換為以下兩行程式碼)

package 包名;

parcelable 類名;

2、非基本型別的資料需要手動匯入:

import 包名.類名

3、AIDL中,除了基本資料型別,其他型別的引數都必須標上方向

  • in(輸入型引數)
  • out(輸出型引數)
  • inout(輸入輸出型引數)

需要注意,不能一概使用inout,因為在底層實現是有開銷的;

4、AIDL中只支援方法,不支援宣告靜態變數;

5、AIDL中實體類的包名必須與它所對應的aidl檔案包名相同。

六、程式碼要怎麼寫?

首先要宣告一下,我這篇文章主要是《Android開發藝術探索》的讀書總結,所以這裡關於程式碼的部分,我是直接照著書上敲了一遍,主要是想了解編寫AIDL的整個流程,其實真正自己敲的時候才會發現問題,然後才能更好更快的掌握。因為第一次寫AIDL,個人理解能力也一般,光在流程上就遇到幾個疑惑的地方,所以在這裡我主要想說說編寫流程。

1、建立一個工程,我們主要關注一下工程目錄,如下圖

2、接著在main目錄下新建一個AIDL檔案