8.4.2 建立AIDL服務的步驟(2)
在編寫上面代碼時應注意如下兩點:
使用bindService方法來綁定AIDL服務。其中需要使用Intent對象指定AIDL服務的ID,也就是<action>標簽中android:name屬性的值。
在綁定時需要一個ServiceConnection對象。創建ServiceConnection對象的過程中如果綁定成功,系統會調用onServiceConnected方法,通過該方法的service參數值可獲得AIDL服務對象。
首先運行AIDL服務程序,然后運行客戶端程序,單擊【綁定AIDL服務】按鈕,如果綁定成功,【調用AIDL服務】按鈕會變為可選狀態,單擊這個按鈕,會輸出getValue方法的返回值,如圖8.26所示。
![]() |
圖8.26 調用AIDL服務的客戶端程序 |
實例53:傳遞復雜數據的AIDL服務
AIDL服務工程目錄:src\ch08\ch08_complextypeaidl
客戶端程序工程目錄:src\ch08\ch08_complextypeaidlclient
AIDL服務只支持有限的數據類型,因此,如果用AIDL服務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
Java的簡單類型(int、char、boolean等)。不需要導入(import)。
String和CharSequence。不需要導入(import)。
List和Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。
AIDL自動生成的接口。需要導入(import)。
實現android.os.Parcelable接口的類。需要導入(import)。
其中后兩種數據類型需要使用import進行導入,將在本章的后面詳細介紹。
傳遞不需要import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable接口的類)的步驟略顯復雜。除了要建立一個實現android.os.Parcelable接口的類外,還需要為這個類單獨建立一個aidl文件,并使用parcelable關鍵字進行定義。具體的實現步驟如下:
(1)建立一個IMyService.aidl文件,并輸入如下代碼:
在編寫上面代碼時要注意如下兩點:
Product是一個實現android.os.Parcelable接口的類,需要使用import導入這個類。
如果方法的類型是非簡單類型,例如,String、List或自定義的類,需要使用in、out或inout修飾。其中in表示這個值被客戶端設置;out表示這個值被服務端設置;inout表示這個值既被客戶端設置,又被服務端設置。
(2)編寫Product類。該類是用于傳遞的數據類型,代碼如下:
在編寫Product類時應注意如下3點:
Product類必須實現android.os.Parcelable接口。該接口用于序列化對象。在Android中之所以使用Pacelable接口序列化,而不是java.io.Serializable接口,是因為Google在開發Android時發現Serializable序列化的效率并不高,因此,特意提供了一個Parcelable接口來序列化對象。
在Product類中必須有一個靜態常量,常量名必須是CREATOR,而且CREATOR常量的數據類型必須是Parcelable.Creator。
在writeToParcel方法中需要將要序列化的值寫入Parcel對象。
(3)建立一個Product.aidl文件,并輸入如下內容: