IME 架構

來源:互聯網
上載者:User

 

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

(責任編輯:貝貝)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.