AIDL 服務只支持有限的數據類型,如果用AIDL服務傳遞一些復雜的數據就需要做更一步處理, AIDL 服務支持的數據類型如下:
1. Java 的原生類型
2. String 和CharSequence
3. List 和 Map ,List和Map 對象的元素必須是AIDL支持的數據類型; 以上三種類型都不需要導入(import)
4. AIDL 自動生成的接口 需要導入(import)
5. 實現android.os.Parcelable 接口的類. 需要導入(import)。
要傳遞一個需要import 的數據類型的值(如: 實現Parcelable接口的類),除了要建立一個實現Parcelable 接口的類外, 還需要為這個類單獨建立一個aidl 文件, 並使用parcelable 關鍵字進行定義.
一. 服務器端
具體步驟如下:
1. 建立一個IMyService.aidl 文件,代碼如下:
package net .blogjava.mobile.complex.type.aidl;
import net.blogjava.mobile.complex.type.aidl.Produce;
interface IMyService {
Map getMap(in String country, in Product product);
Product getProduct();
}
注意: 如果方法參數的類型不是原生類型,如String,List或自定義實體類,需要使用in、 out或 inout 修飾,in表示這個值被客戶端設置; out 表示這個值被服務端設置,inout 表示這個值既被客戶端設置,又被服務端設置.
2. 編寫 Product 類,該類是用於傳遞的數據類型,它實現了Parcelable接口,用於序列化對象,之所以不用java.io.Serializable 接口,是因為Serializable 接口序列化的效率沒有Parcelable接口高
(1) 在Product 類中必須有一個靜態常量,常量名必須為CREATOR,而且CREATOR 常量的數據類型必須是Parcelable.Creator
(2) 在writeToParcel 方法中需要將要序列化的值寫入 Parcel 對象
3. 建立一個Product.aidl 文件,代碼: parcelable Product;
4. 編寫一個MyService類
5. 在AndroidManifest.xml文件中配置MyService 類,代碼:
<service android:name=".MyService">
<intent-filter><action android:name="net.blogjava.mobile.complex.type.aidl.IMyService" /></intent-filter>
</service>
二.客戶端
首先將IMyService.java和Product.java文件復制到客戶端工程(ch08_complextypeaidlclient),然后綁定AIDL服務,並獲得AIDL服務對象,最后調用AIDL 服務的方法