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文件,并輸入如下代碼:
- package net.blogjava.mobile.complex.type.aidl;
- import net.blogjava.mobile.complex.type.aidl.Product;
- interface IMyService
- {
- Map getMap(in String country, in Product product);
- Product getProduct();
- }
在編寫上面代碼時要注意如下兩點:
Product是一個實現android.os.Parcelable接口的類,需要使用import導入這個類。
如果方法的類型是非簡單類型,例如,String、List或自定義的類,需要使用in、out或inout修飾。其中in表示這個值被客戶端設置;out表示這個值被服務端設置;inout表示這個值既被客戶端設置,又被服務端設置。
(2)編寫Product類。該類是用于傳遞的數據類型,代碼如下:
- package net.blogjava.mobile.complex.type.aidl;
-
- import android.os.Parcel;
- import android.os.Parcelable;
-
- public class Product implements Parcelable
- {
- private int id;
- private String name;
- private float price;
- public static final Parcelable.Creator<Product>
CREATOR = new Parcelable.Creator<Product>()
- {
- public Product createFromParcel(Parcel in)
- {
- return new Product(in);
- }
-
- public Product[] newArray(int size)
- {
- return new Product[size];
- }
- };
- public Product()
- {
- }
- private Product(Parcel in)
- {
- readFromParcel(in);
- }
- @Override
- public int describeContents()
- {
- return 0;
- }
- public void readFromParcel(Parcel in)
- {
- id = in.readInt();
- name = in.readString();
- price = in.readFloat();
- }
- @Override
- public void writeToParcel(Parcel dest, int flags)
- {
- dest.writeInt(id);
- dest.writeString(name);
- dest.writeFloat(price);
- }
- // 此處省略了屬性的getter和setter方法
- ... ...
- }
在編寫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文件,并輸入如下內容:
- parcelable Product;