IME 架構
Android的IME架構比價複雜。從進程的角度來講,相關功能主要分布在下面三個位置:
用戶端應用是一個包含有圖形介面的應用,如地址本。圖形介面上包含有能夠接收輸入的編輯框,如TextView。
IME模組提供軟鍵盤,將使用者在軟鍵盤上的按鍵輸入根據某種演算法(如Zi, T9, 國筆等)轉換成單詞,然後傳遞給用戶端應用。目錄development/samples/SoftKeyboard下提供了一個IME模組執行個體。如果想要實現一個中文IME,可參考這個執行個體。
平台部分實現一些管理功能,負責裝載某個IME模組,啟動,終止該模組等。
相關代碼主要位於下面幾個位置。其中,位於3,5,6,7目錄下的代碼最值得關注。
1. frameworks/base/core/java/com/android/internal/view
這個目錄下定義了幾個重要的idl 介面。
IInputMethod.aidl 定義了IInputMethod idl 介面,用於用戶端跨進程操作InputMethod介面。
IInputMethodSession.aidl 定義了IInputMethodSession介面,是IInputMethod的輔助介面。用於用戶端跨進程操作InputMethodSession介面。
IInputMethodCallback.aidl定義了一個helper 介面,由用戶端實現。IInputMethod.aidl和IInputMethodSession.aidl執行個體可以分別調用該介面中的不同方法
IInputMethodManager.aidl 定義了Input Method Manager的service介面。用戶端通過InputMethodManager interface調用這個service。
InputMethodManagerService.java實現了IInputMethodManager.aidl介面
IInputMethodClient.aidl定義介面,標識一個Input Method Manager 的客戶。這個service在用戶端實現,提供給server端調用。
IInputContext.aidl定義了一個介面,由用戶端提供InputMethod使用。InputMethod可以與用戶端互動,調用用戶端提供的callback。
IInputConnectionWrapper.java 實現了IInputContext介面。
IInputContextCallback.aidl定義了一個介面,定義了一組callback函數給IInputContext.aidl執行個體調用,從用戶端返回資訊給InputMethod。
InputConnectionWrapper.java實現了IInputContextCallback介面。
2. frameworks/base/services/java/com/android/server
InputMethodManagerService.java實現了IInputMethodManager.aidl介面
3. frameworks/base/core/java/android/view/inputmethod
這個目錄下定義了幾個重要的interface和類。
InputMethodManager.java實現了InputMethodManager 類。此類調用IInputMethodManager.aidl介面功能,而IInputMethodManager.aidl介面功能由InputMethodManagerService.java實現,並運行在不同於用戶端進程的server進程中。
InputConnection.java定義了InputConnection interface。InputConnection 介面在IME和用戶端之間建立了一個串連,IME可以使用該串連擷取或發送資訊給用戶端。InputConnection執行個體由用戶端建立之後傳遞給IME使用。BaseInputConnection.java 實現了InputConnection介面的一個基類: BaseInputConnection。 EditableInputConnection.java實現了一個衍生類別
InputBinding.java 定義了類InputBinding,這個類實現了parcelable 介面。這個類的成員變數包含了用戶端傳向server的資訊。
InputMethod.java定義了InputMethod interface。檔案InputMethodService.java中類InputMethodImpl實現了這個介面。這個介面定義了一套操縱一個IME的方法。如,createSession,startInput等。要編寫一個具體IME的話,就需要派生這個介面。
InputMethodSession.java定義了InputMethodSession介面。檔案InputMethodService.java中類InputMethodSessionImpl實現了這個介面。InputMethodSession是InputMethod的輔助介面,用於具體和某個IME用戶端互動。
CompletionInfo.java 類描述一個text completion.
EditorInfo.java類描述一個接收輸入的view的屬性,如內容屬性(text, digit, etc)。
ExtractedText.java類描述從view中提取的傳遞給IME的文字屬性。
4. frameworks/base/core/java/com/android/internal/widget
EditableInputConnection.java實現了BaseInputConnection的一個衍生類別。
5. frameworks/base/core/java/android/inputmethodservice
這個目錄下的代碼提供了實現一個具體IME的架構類。從這些類派生,就可以定製一個IME。
SoftInputWindow.java中的SoftInputWindow類是一個Dialog子類。它代表一個IME的最上層視窗(由視窗管理器管理),這個視窗由上到下,包含extractArea, candidatesArea, 和 inputArea。
Keyboard.java 中的Keyboard類裝載並解析一個描述虛擬鍵盤(Soft Keyboard)的xml檔案(如development/samples/SoftKeyboard/res/xml),並儲存該鍵盤的屬性,如該虛擬鍵盤包含多上行,每行有哪些鍵等。
KeyboardView.java 中的KeyboardView類是一個View子類。它根據Keyboard資料結構真正的在screen上畫出一個虛擬鍵盤。這個虛擬鍵盤就是SoftInputWindow中的inputArea。
AbstractInputMethodService是Service的衍生類別,並實現了KeyEvent.Callback 介面。實現了InputMethod 和 InputMethodSession的基類。dispatchKeyEvent 函數將收到的key event傳給相應的key 處理函數(在衍生類別中實現)。當這個service被用戶端綁定時,其onBind()函數給用戶端返回了一個IInputMethodWrapper執行個體,這個執行個體實現了IInputMethod idl介面。用戶端可以使用該介面的相關功能。
IInputMethodWrapper.java 實現了IInputMethod idl 介面。這個類收到用戶端的跨進程命令後,調用InputMethod完成相應功能。
IInputMethodSessionWrapper.java 實現了IInputMethodSession idl介面。這個類收到用戶端的跨進程命令後,調用InputMethodSession完成相應功能。
6. frameworks/base/core/res/res/layout
這個目錄下存放著一些系統資源。其中,
input_method.xml描述了一個IME的視窗(即SoftInputWindow)布局,從上往下,依次排列extractArea, candidatesArea 和 inputArea。
input_method_extract_view.xml。
7. development/samples/SoftKeyboard
這個目錄下代碼實現了一個的IME執行個體--軟鍵盤英文/數字IME。這裡面實現的類大都是從frameworks/base/core/java/android/inputmethodservice 中的類派生而來。
AndroidManifest.xml:描述這個.apk提供的service以及關於這個IME的一些資訊。
res/xml/目錄下儲存著幾個描述不同虛擬鍵盤的xml檔案。
LatinKeyboard.java中的LatinKeyboard類是Keyboard的子類。
LatinKeyboardView.java中的LatinKeyboardView類是KeyboardView的子類。
8. frameworks/base/core/java/android/widget
在這裡TextView.java是使用Input Method Framework (IMF)的用戶端。TextView建立了一個InputMethodManager的執行個體並調用其restartInput 函數。
InputMethodManager::restartInput函數建立了一個InputConnection 執行個體並調用IInputMethodManager::startInput。
IInputMethodManager::startInput 函數使用mContext.bindService啟動一個InputMethod service, 如 Sample Soft Keyboard。
9. frameworks/base/core/java/com/android/internal/widget
(責任編輯:貝貝)