寫這篇筆記記錄一下APP與IME的一些處理流程
如果IME是第三方公司的寫的,這對(duì)于調(diào)試來(lái)說(shuō)非常痛苦,因?yàn)闆](méi)有源碼,這不,最近就遇到這樣的事,IME是Google的LeanbackIme.
測(cè)試環(huán)境:
TV 盒子 + Android P + LeanbackIme + 鍵盤輸入
一. 從鍵盤上按下a鍵后, EditText是怎么收到a鍵,然后更新內(nèi)容的
這里直接分析的是App端收到了輸入事件.
圖1 鍵盤事件傳輸
如圖所示
APP - > IME
- ViewRootImpl中的WindowInputEventReceiver收到Input傳遞過(guò)來(lái)的KeyEvent(a)事件
- ViewRootImpl將KeyEvent傳遞給內(nèi)置的幾個(gè)InputStage,
- ImeInputStage將KeyEvent通過(guò)NativeInputEventSender中的InputChannel(socket)發(fā)送給IME.
- IME對(duì)于App發(fā)送過(guò)來(lái)的KeyEvent決定是否consume
IME -> APP
- IME將KeyEvent的consume的結(jié)果通過(guò)InputChannel再發(fā)送給APP
- APP中的NativeInputEventSender收到IME事件,最后會(huì)調(diào)用到ImeInputStage中的onFinishedInputEventCallback.
- ImeInputStage根據(jù)Ime對(duì)于KeyEvent的處理結(jié)果,決定是否finish或forward
- 本例中LeanbackIme不會(huì)consume, 所以ImeInputStage繼續(xù)將KeyEvent forward到EditText
- 最終EditText.onKeyDown consume掉該keyevent, 更新mText
二. 從鍵盤上按Enter鍵
按Enter鍵后,與上一節(jié)不同在于LeanbackIme會(huì)消費(fèi)掉物理Enter鍵,所以物理按鍵Enter不會(huì)被deliver到EditText, 在ImeInputStage就被finish掉了, 而進(jìn)入下面的流程。
圖2 Enter鍵處理
如圖2所示,最終由ViewRootImpl發(fā)送虛擬的Enter按鍵事件,后面的處理流程就一樣了,最終EditText會(huì)hide IME.
三. 至于一些類,怎么初始化的,不再本節(jié)研究之內(nèi)
image.png
image.png