為了克服Linux中IPC各種方式的缺點,在Android中引入了Binder機制。但是當說起Binder在Android中的使用時,幾乎所有的資料都是在說AIDL的使用。AIDL的全稱是Android Interface Definition Language,即Android接口定義語言,是Binder機制實現Android IPC時使用比較廣泛的工具。
下圖展示了該Demo的結構圖和AIDL關鍵文件:
? 1、建立兩個App,分別為Client端和Server端。
? ? ? 這個比較 好理解,Server端就是包含了Service真正干活的那一端;Client端就是通過遠程操控指揮的那一端,分別在不同的App中。如下圖所示:
? 2、在Server端main目錄下建立aidl文件夾以及.aidl文件,并copy一份到Client端,如圖6.1中②處所示結構。注意,Client端和Server端②處是一模一樣的。另外,AS中提供了快捷方式創建aidl文件,在main處點擊右鍵 > New > AIDL > AIDL File文件,按照提示給aidl文件命名即可自動創建完成,可以看到文件路徑也是該項目的包名。
? 這里給aidl命名為IDemoService.aidl,這里需要注意的是命名規范,一般都是以“I”開頭,表示是一個接口,其內容如下:
//========== IDemoService.aidl========
package com.songwei.aidldemoserver;
// Declare any non-default types here with import statements
interface IDemoService {
? ? void setName(String name);
? ? String getName();
}
? 3、Server端創建Service文件?AidlService.java,如圖6.1中③處所示,代碼如下:
<service
? ? android:name=".AidlService"
? ? android:exported="true">
? ? <intent-filter>
? ? ? ? <action android:name="com.songwei.aidl" />
? ? </intent-filter>
</service>
? ? ?這里有幾點需要注意:
? ? (1)exported屬性值,如果有“intent-filter”,則默認值為true,否則為false。所以這里其實可以去掉,因為有“intent-filter”,其默認值就是true。
? ? (2)由于筆者在后面啟動該service的時候用的action的方式,所以這里就有了“intent-filter”里面的action。如果用其他方式啟動,這個service的注冊信息就需要相應的改動了,有一定開發經驗的讀者應該都知道,就不展開講了,主要是怕讀者容易忽略這里,所以特別提醒一下。
? 4、編譯Sever端和Client端App,生成IDemoService.java文件。
? ? ? ?當編譯的時候,AS會自動為我們生成IDemoService.java文件,如圖6.1和圖6.2中④處所示。當你打開該文件的時候,是不是看到了如下場景?
AIDL是Android接口定義語言,IDemoService.java是一個java中的interface(接口),現在是不是若有所思了呢?AIDL正是定義了IDemoService.java這個接口!!! 這個接口文件就是AIDL幫助咱們生成的Binder相關代碼,這些代碼就是用來幫助實現Client端和Server端通信的。前面第2步中提到的IDemoService.aidl文件,其作用就是作為原料通過AIDL來生成這些你貌似看不懂的代碼的,第3步中的AidlService.java和后續在Client端App連接Server端App的時候,其實這個aidl文件就從來沒有出現過,也就是說,它已經沒有什么價值了。所以說,AIDL的作用就是用來自動生成Binder相關接口代碼的,而不需要開發者手動編寫。
? ? ? ?打開IDemoService.java文件后,點擊主菜單蘭Code > Reformat Code (或 Ctrl + Alt +L快捷健),會看到如下形式的接口文件: 后面在講完Client端和Server端的連接及通信后,還會繼續深入剖析這個文件。
? 5、Client端ClientActivity連接Server端AidlService并通信
? ? ? ?ClientActivity.java的內容如下,布局文件在此省略,比較簡單,就兩個按鈕,一個用于綁定,一個用于解綁,看Button命名也很容易分辨。
? 6、運行
? ? ? ?運行的時候,需要先啟動Service端進程,才能在Client端中點擊“綁定”的時候綁定成功。完成一次“綁定”和“解綁”,得到的log如下所示:
可以結合前面的ClientActivity.java和AidlService.java代碼中的添加的log,來理解一下這個流程。