有如下AIDL代碼:
package android.hardware;
import android.content.Context;
/**
* {@hide}
*/
interface IEinkctlService
{
boolean updateModeLock(boolean acquired, Context context);
int retrieveWorkMode();
boolean switchWorkMode(int mode);
}
編譯時間總是提示couldn't find import for class android.content.Context
似乎是找不到Context類,而實際上我們都知道android.content.Context確實是存在的。
上網搜尋一番,發現遇到此問題的人不少。
其實,要明白這個問題需要先搞清楚什麼樣的類是需要且可以import進AIDL中的。
參考《Android/OPhone開發完全講義》第8章裡的一段敘述:
“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關鍵字進行定義。”
到此應該很清楚了,Context類並不是一個實現了Parcelable介面的類,也沒有對應的AIDL檔案,因此不能夠在AIDL中import。
補充一句,網上有一種“辦法”,說是在frameworks/base/Android.mk中的LOCAL_AIDL_INCLUDES := $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)前加上LOCAL_AIDL_INCLUDES := 欲import的類所在位置。其實這種“辦法”也是受上面所說的import規則限制的。一個沒有實現Parcelable介面的類,這種“辦法”也是無能為力的。