小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          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文件,并輸入如下代碼:

          1. package net.blogjava.mobile.complex.type.aidl;  
          2. import net.blogjava.mobile.complex.type.aidl.Product;  
          3. interface IMyService    
          4. {    
          5.     Map getMap(in String country, in Product product);  
          6.     Product getProduct();       

          在編寫上面代碼時要注意如下兩點:

          Product是一個實現android.os.Parcelable接口的類,需要使用import導入這個類。

          如果方法的類型是非簡單類型,例如,String、List或自定義的類,需要使用in、out或inout修飾。其中in表示這個值被客戶端設置;out表示這個值被服務端設置;inout表示這個值既被客戶端設置,又被服務端設置。

          (2)編寫Product類。該類是用于傳遞的數據類型,代碼如下:

          1. package net.blogjava.mobile.complex.type.aidl;  
          2.  
          3. import android.os.Parcel;  
          4. import android.os.Parcelable;  
          5.  
          6. public class Product implements Parcelable  
          7. {  
          8.     private int id;  
          9.     private String name;  
          10.     private float price;  
          11.     public static final Parcelable.Creator<Product>
             CREATOR = new Parcelable.Creator<Product>()  
          12.     {  
          13.         public Product createFromParcel(Parcel in)  
          14.         {  
          15.             return new Product(in);  
          16.         }  
          17.  
          18.         public Product[] newArray(int size)  
          19.         {  
          20.             return new Product[size];   
          21.         }  
          22.     };  
          23.     public Product()  
          24.     {  
          25.     }  
          26.     private Product(Parcel in)  
          27.     {  
          28.         readFromParcel(in);  
          29.     }  
          30.     @Override  
          31.     public int describeContents()  
          32.     {  
          33.         return 0;  
          34.     }  
          35.     public void readFromParcel(Parcel in)  
          36.     {  
          37.         id = in.readInt();  
          38.         name = in.readString();  
          39.         price = in.readFloat();  
          40.     }  
          41.     @Override  
          42.     public void writeToParcel(Parcel dest, int flags)  
          43.     {  
          44.         dest.writeInt(id);  
          45.         dest.writeString(name);  
          46.         dest.writeFloat(price);  
          47.     }  
          48.     //  此處省略了屬性的getter和setter方法  
          49.     ... ...  

          在編寫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文件,并輸入如下內容:

          1. parcelable Product; 
          posted on 2010-11-19 16:58 小菜毛毛 閱讀(569) 評論(0)  編輯  收藏 所屬分類: andriod
          主站蜘蛛池模板: 香格里拉县| 共和县| 光山县| 开化县| 遂平县| 枣强县| 安远县| 宁乡县| 西盟| 济宁市| 汨罗市| 中卫市| 小金县| 彰化市| 观塘区| 苗栗市| 岗巴县| 阿瓦提县| 桦川县| 平顺县| 达日县| 三门峡市| 靖江市| 专栏| 美姑县| 满洲里市| 蓬溪县| 太仆寺旗| 荥阳市| 海城市| 称多县| 兴和县| 合江县| 刚察县| 抚顺县| 永福县| 罗甸县| 天柱县| 阿克陶县| 家居| 博野县|