Android基礎進階之學習使用AIDL進行跨程序通訊
- AIDL是什麼
AIDL (Android Interface Definition Language), 即介面定義語言,Android提供的IPC (InterProcess Communication,程序間通訊)的一種獨特實現。 藉助它,你可以定義介面,使得客戶端和服務端之間實現程序間通訊。對android來說,一個程序無法通過正常的方法來訪問另一個程序的記憶體空間。可以說,他們需要把物件分解成作業系統可以理解的原子型別,然後使物件突破限制在不同程序之間進行傳輸。具體實現這種機制的程式碼寫起來非常枯燥,所以android為你提供了AIDL語言來進行處理。
- 使用AIDL可以解決什麼樣的問題
當你需要來自不同應用的客戶端訪問你的服務時,你就需要一個AIDl了。 舉個小栗子: 手機管家提供了黑名單、號碼攔截等服務,手機通訊錄、簡訊等應用需要實時獲取已經被加入給名單或者標記的號碼,而這部分資料是儲存在手機管家這個app的資料庫中。那麼,為了方便通訊錄和簡訊這些應用訪問資料,手機管家就可以通過實現AIDL提供這項服務。
- 手把手教你寫一個Demo感受Aidl的使用
第一步:編寫Server端(提供服務方) 1.在工程目錄下,定義一個Aidl檔案。New-File

image
- 2. 編寫這個檔案,AIDL使用簡單的語法可以宣告一個帶有一個或者多個帶有引數和返回值方法的介面引數和返回值可以是任何型別。非常類似Java。 在這裡,我們嘗試在介面中定義兩個方法。一個返回String型別,一個返回Int型。

image
- 3.建立一個提供這項服務的Service 如果eclipse有自動編譯的話,或者手動clean一下專案,就會發現在工程的gen目錄下,SDK工具已經生成一個.java介面檔案(和.aidl檔案同名)。主要包含一個名字為Stub的子類,這是一個它父類的抽象實現,並且聲明瞭.aidl中所有的方法。

image
其中Stub類有一個叫asInterface的靜態方法,主要用來返回這個Stub介面的例項。
- 4.把介面暴露給客戶端(其他需要此方法的應用),這就需要繼承Service實現onBind方法,並返回一個你已經實現了的Stub類。 testString 這個方法,返回了一個字串拼接的結果;testInt 這個方法,返回的是兩個int值相加求和的結果。

image
- 5.當然還有最重要的,也是初學者容易忽略的幾點。 涉及到的service要在AndroidManifest.xml中註冊,注意一定要新增android:exported="true"屬性(否則會在客戶端訪問時報安全異常)。並且記得在server應用啟動時,觸發啟動這個提供服務的AidlService.java。 如此,服務端就算部署完成了。 第二步:編寫客戶端(獲取服務方)
1. 把Server端中的IService.aidl拷貝一份到Client端工程目錄下,注意放的路徑的包名一定要和Server端相同。
2. 在Client端的MainActivity中,實現一個ServiceConnection物件,在這個物件的onServiceConnected回撥方法中,就可以拿到我們所需要的提供遠端服務的物件。

image
3. 編寫連線這個服務和斷開這個服務的方法。分別在MainActivity的onCreate和onDestroy方法中呼叫。

image
如此,客戶端呼叫方式基本明朗。編寫完畢。
- 第三步:效果演示
首先,我們執行一下server端,開啟remote遠端AidlService,使其在執行中。然後執行Client應用,打Log,結果如下:

image
關閉Client應用,結果如下:

image