最近研究了一下Android輸入法,發現Android輸入法框架中按鍵消息的處理流程和一般應用程序的處理流程有很大的不同,故在此做個總結。
一、一些名詞縮寫
IMF(Input MethodFramework):輸入法框架
IM(Input Method):輸入法
IMS(Input Method Service):輸入法服務,一般指一個具體輸入法對應的服務
IMMS(Input Method ManagerService):輸入法管理器服務,系統進程的一部分,系統中只有一個該服務的實例
IMM(Input Method Manager):輸入法管理器,每個客戶進程中都包含一個
IME(Input Method Engine/InputMethod Editor):指一個具體的輸入法,包括其內部的IMS和Binder對象
CA(Client Application):客戶端進程,這裡指使用輸入法的進程。
二、輸入法框架
1、 客戶端進程(CA):在每個CA中都存在唯一一個IMM,UI控件(View,TextView,EditText等)可以通過它來訪問IMMS,用來操作輸入法,比如,打開,關閉,切換輸入法等。可以通過Context.getSystemService()來獲取一個InputMethodManager的實例。
IMM中有2個Binder對象,一個是可編輯UI控件對應的Binder對象(InputContext),輸入法進程可以通過InputContext將虛擬按鍵事件(即通過觸屏消息轉換而來的按鍵事件)傳遞給UI控件;另一個是InputMethodClient,IMMS將通過它訪問CA,例如IMMS通過它將IMS的InputMethodSession傳遞給CA,從而使得CA可以直接訪問IMS。
2、輸入法進程:和客戶端進程類似,它也有2個Binder對象,一個是IMS對應的Binder對象,IMMS將通過它去控制輸入法,例如:顯示或者隱藏輸入法窗口;另一個是專門供客戶端使用的Binder對象,客戶端主要通過它來向輸入法進程傳送按鍵事件。
具體可參見下圖:
三、按鍵消息的處理流程
具體請見下圖: