有如下AIDL代 碼:
package android.hardware;
import android.content.Context;
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接口的類,這種“辦法”也是無 能為力的。