編輯:關於Android編程
安卓輸入法框架(Input Method Framework)IMF
一.輸入法框架簡介
自Android平台1.5版本以後,Google開放了 Android平台輸入法框架(InputMethod Framework, IMF) , IMF是Android平台的特色設計。它的出現大大推動了不帶實體鍵盤的設備的誕生。同時,Android平台輸入法框架也給出了輸入法的開發所需要的接口,為Android平台的輸入法提供了可擴展性。
二.輸入法框架組成
一個IMF結構中包含三個主要的部分:
●(輸入法服務)input method manager(IMM):管理各部分的交互,是一個客戶端API,存在於各個應用程序的context中,用來溝通管理所有進程間交互的全局系統服務,可以通過Context.getSystemService()來獲取一個InputMethodManager 的實例。
●(輸入法應用)input method(IME):實現一個允許用戶生成文本的獨立交互模塊。系統綁定一個當前的輸入法。使其創建和生成,決定輸入法何時隱藏或者顯示它的UI。同一時間只能有一個IME運行。
●(客戶端)client application:通過輸入法管理器控制輸入焦點和IME的狀態。一次只能有一個客戶端使用IME。
輸入法整體框架如圖1所示:
圖1.輸入法的總體框架
2.1 IMM的實現
InputMethodManagerService.java 是整個系統當中,一切與輸入法有關的地方的總控制中心。它通過管理下面三個模塊來實現系統的輸入法框架。
(1)WindowManagerService
負責顯示輸入法,接收用戶事件。
(2)InputMethodService
輸入法內部邏輯,鍵盤布局,選詞等,最終把選出的字符通過 commitText 提交出來。
(3)InputManager
由 UI 控件(View,TextView,EditText等)調用,用來操作輸入法。比如,打開,關閉,切換輸入法等。
2.2 輸入法應用組成
在IMF中,最主要的是輸入法應用,他繼承於Abstract InputMethodService。InputMethodService主要由以下幾個組件構成,其中包括完成輸入法的相關UI和文字的輸出。
(1)軟鍵盤視圖(SoftInput View)
這是軟鍵盤的輸入區域,主要完成在觸摸屏下和用戶的交互輸入。onCreateInputView()被調用來進行軟鍵盤視圖的實例化;onEvaluateInputViewShown()決定是否顯7K軟鍵盤視圖;當狀態改變的時候,調用updateInputViewShownO來重新決策是否顯示軟鍵盤視圖。
(2)候選字視圖(CandidatesView)
Candidates View也是輸入法中一個相當重要的組件。當用戶輸入字符的時候,顯不相關的列表。停止輸入的時候,就會自動消失。onCreateCandidatesView()來實例化自己的輸入法。和軟鍵盤視圖不同的是,候選字視圖對整個UI布局不會產生影響。setCandidatesViewShown(boolean)用來設置是否顯示候選字視圖。
(3)輸出字符
字符的輸出是InputMethodService最核心的功能,輸入法通過InputConnection從IMF來獲得字符輸出。並且通過不同的編輯器(editor)類型來獲取相應的支持。通過 onFinishlnputO和onStartInput(EditorInfo, boolean)方法來進行輸入目標的切換。
另外,
onlnitializelnterfaceO用於InputMethodService在執行的過程中配置的改變;
onBindlnputO切換一個新的輸入通道;
onStartInput(EditorInfo, boolean)處理一個新的輸入。
三.輸入法消息流轉機制
輸入法框架包括客戶端、輸入法服務和輸入法應用三部分組成,如圖2所示。輸入法框架中消息的流轉機制為:當客戶端獲得焦點,啟動輸入法,創建一個連接類型對象,以實現輸入法框架各個層次間信息的傳輸。該連接類型實現了InputConnection 接口。
圖2.輸入法消息流轉
四.輸入法生命周期
輸入法是用戶、應用程序之間的交互的渠道,所有的輸入法應用都需要繼承特定的Android平台提供的服務。Android平台的輸入法框架為輸入法應用定義了一個基類InputMethodService,InputMethodService提供了一個輸入法的標准實現流程,定義了輸入法生命周期內的重要函數,以方便開發人員對Android輸入法進行擴展。圖3即為Android輸入法生命周期。
圖3.Android輸入法生命周期
具體的實現步驟為:
1.當用戶點擊客戶端輸入控件(如editor),客戶端控件獲得焦點,InputMethodService啟動,調用其onCreate()函數。該函數在輸入法第一次啟動的時候被調用,用來做初始化的設置;
2. 調用onCreatelnputViewO函數,在該函數中創建鍵盤視圖(KeyboardView)並返
回;
3. 調用onCreateCandidatesView()函數,在該函數中創建候選字視圖(Candidates
View)實現並返回;
4. 調用onStartlnput()函數,始接收並處理輸入內容;
5. 輸入結束後調用onFinishlnputO函數來結束當前的輸入;
6. 如果移動到下一個輸入框,則重復調用onStartlnputView和onFinishlnput函數;
7. 在輸入法關閉的時候調用onDestroy()函數。
五.輸入法主要的類和函數
在Android輸入法開發過程中,下面三個類的實現比較重要:
InputMethodService類:提供了很多的輸入法的基礎實現,管理狀態的條款、輸入法的可見度、與當前可見的Activity溝通;
CandidateView類:提供候選字選擇視圖,直接繼承於View。負責顯示軟鍵盤上面的那個候選區域。
LatinKeyboard類:軟鍵盤類,直接繼承與Keyboard類。負責解析並保存鍵盤布局,並提供選詞算法,供程序運行當中使用。其中鍵盤布局是以XML文件存放在資源當中的。
Android的輸入法服務,通過一些接口函數與系統進行交互,在這些接口中,主要接口是InputMethodService。它提供了一個輸入法的標准實現,開發輸入法時可以參照和自定義該實現,表1顯示了InputMethodService接口提供的函數。
主要接口函數
說明
onlnitializelnterface
進行UI的初始化,創建和修改時調用此接口
onBindlnput
在另外的客戶端和該輸入法連接時調用
onStartlnput
初始化整個輸入法,非常重要的一個回調,它在
編輯框中用戶已經開始輸入的時候調用
onCreatelnputView
創建輸入視圖,返回一個層次性的輸入視圖,而且只是在這個視圖第一次顯示的時候被調用
onCreateCandidatesView
創建候選框視圖,當需要候選框顯示時調用
onCreateExtractTextView
全屏模式下的視圖
onStartlnput View
在輸入視圖被顯示並且在一個新的輸入框中輸入已經開始的時候調用
getCurrentlnputConnection
此函數呼叫應用程序,接收原始的按鍵事件
onFinishlnput
結束輸入法
表1.InputMethodService接口提供的函數
六.輸入法服務流程
6.1 客戶端應用注冊到輸入法系統服務
6.1.1創建LocationManger
1)客戶端應用創建時,調用ViewRoot(…);
2)調用ViewRoot .getWindowSession(…);
3)通過調用InputMethodManager.getInstance()創建LocationManager對象,一個客戶端應用只會創建一個LocationManager對象;
4)LocationManager對象創建時,會創建一個IInputMethodClient對象,同時創建一個IInputContext對象;
6.1.2注冊到輸入法系統服務
1)調用WindowMangerService. openSession(…);
2)調用WindowMangerService. Session(…);
3)調用InputMethodMangerService.addClient(IInputMethodClientclient, IInputContext inputContext, int uid, int pid) ,將InputMethodManager中創建的IInputMethodClient對象以及InputMethodManager中創建的IInputContext對象傳入進去,其中uid為客戶端應用用戶ID,pid為客戶端應用進程ID;
4)加入到InputMethodManagerService維護的一個列表HashMap
6.2 客戶端應用調用輸入法
1)TextView.setText();
2)調用InputMethodManager.restartInput();
3)調用InputMethodManager. startInputInner();
4) 調用InputMethodManagerService. startInput(IInputMethodClient,IInputContext…);
6.3 輸入法系統服務調用輸入法
輸入法系統服務調用輸入法包括輸入法系統服務啟動輸入法,輸入法創建,輸入法系統服務建立與輸入法的會話,輸入法系統服務啟動輸入法以及輸入法服務顯示輸入法。
七.Android手機輸入法設計的主要內容
一款手機輸入法能否得到用戶的認可,主要取決於輸入法的易用性和高效性以及界面的美觀度。因此,IME 程序的設計主要是用戶交互接口的設計和編碼轉換引擎的設計。
首先,對於軟鍵盤輸入法來說,軟鍵盤的布局設計在很大程度上影響著用戶的使用,同時,由於手機設備的屏幕大小限制,如何處理輸入法中軟鍵盤和候選框、組合框、狀態窗口的相對位置和大小也是輸入法界面設計的重要部分。
其次,由於智能終端設備的處理器和內存的限制,如何設計一個系統內存占用小,CPU使用率低的編碼轉換引擎和詞庫存儲方案也是手機輸入法設計的重要組成部分。
具體來說,IMF 框架以及要編寫 Android 輸入法需要實現的模塊如圖4 所示。
圖 4.Android 輸入法模塊
為了實現android activity之間的數據傳遞,主要利用意圖Intent 對象的方法來完成。 基本數據類型的傳遞是相當簡單了,主要通過如下方式完成如下: putE
Android和iOS開發都支持C++開發,可以一套代碼多平台使用。同時C++難以反編譯的特性也可以為Android開發帶來代碼的保密,另一native特性也可以提高代碼
Android中的傳遞有兩個方法,一個是Serializable,另一個是Parcelable。 Serializable是J2SE本身就支持的。而Parc
效果圖如圖所示:注解:此方法類 是本人在網上找的。並非本人的,拿來自己修改就直接用了import me.imid.movablecheckbox.R;import and