AIDL全稱為Android Interface Definition Language,它可以使你的程式實現處理序間通訊(IPC),並且在實現IPC的基礎上允許多線程訪問。
首先,我們要建立一個自己的.aidl檔案(見Demo中的IRemoteService.aidl)。
定義AIDL檔案與java中建立介面非常的類似。一般來說,aidl支援的資料類型有五種:java基礎資料型別 (Elementary Data Type);String;CharSequence;List;Map。其中List和Map較為特殊(http://developer.android.com/guide/components/aidl.html#Create)。如果你使用的資料類型不是AIDL的基礎資料型別 (Elementary Data Type),你必須要使用import語句將其匯入,即使他們是在同一個package下。聲明方法時,方法的參數可以零到多個,傳回值可以是void;所有的非基礎資料型別 (Elementary Data Type)都需要指定是傳入還是傳出值(基礎資料型別 (Elementary Data Type)都是傳入值;在AIDL檔案中不能聲明靜態欄位)
其次,我們要實現我們上面剛剛建立的介面(見Demo中StudentService中的mBinder)。
假設我們有一個AIDL檔案叫IRemoteService.aidl,當我們編譯我們的項目的時候,android的ant能將我們的AIDL檔案產生為java檔案(放在gen/下面)。這個java檔案中有一個抽象內部類Stub(繼承了Binder類)實現了我們的介面,並提供了一個asInterface方法將IBinder對象轉化為我們的介面類型。因為實現我們的介面就轉化為實現其抽象內部類Stub(Service端的業務函數全部在這裡實現)。
再次,將我們的介面暴露給用戶端(注意Demo在Server端AndroidManifest.xml中對StudentService的聲明)
將我們的介面暴露給用戶端實際上就是:在Service的onBind函數中將我們的Stub類的執行個體反出去。
這樣,Service端的工作就完成了!
那麼,怎樣通過IPC傳遞對象呢(見Demo中的Student.java和Student.aidl)?
如果你想在進程間傳遞對象,那麼對象就必須實現Parcelable介面。而實現這個介面需要我們完成以下幾步:
1、在聲明對象的時候實現Parcelable介面
2、實現writeToPacel方法
3、添加一個叫做CREATOR的靜態變數(這個變數要實現Parcelable.Creator介面)
4、建立一個AIDL檔案來聲明這個實現了Parcelable介面的類
這樣我們就可以在AIDL中使用對象了。
用戶端怎麼對Service端的方法進行調用呢?
其實很簡單,只需要一下幾步就可以了(見Demo中的Client中的代碼)。
1、將Server端使用的.aidl檔案拷貝到client程式中,如果你的aidl檔案僅僅是對實現了Parcelable介面的類的說明,那麼,對應的java檔案也要拷貝過去。(注意包名,具體可參考Demo的client端對Sever端AIDL檔案的匯入)
2、編譯client程式,將在gen/目錄下產生AIDL對應的的類檔案
3、實現ServiceConnection介面。在onServiceConnected方法中,使用AIDL產生的Java檔案的函數(內部類Stub的asInterface)將onServiceConnected函數的中IBinder參數轉化為AIDL產生的介面對象。
4、根據第3步得到的對象來調用AIDL中的函數。
5、調用bindService函數執行綁定操作(解除綁定使用unbindService函數)
到這裡,AIDL的使用講解就結束了。推薦你結合本文的Demo來讀這篇文章,相信會讓你受益匪淺的。
Demo連結:http://pan.baidu.com/share/link?shareid=587849&uk=2953765628