写这篇笔记记录一下APP与IME的一些处理流程
如果IME是第三方公司的写的,这对于调试来说非常痛苦,因为没有源码,这不,最近就遇到这样的事,IME是Google的LeanbackIme.
测试环境:
TV 盒子 + Android P + LeanbackIme + 键盘输入
一. 从键盘上按下a键后, EditText是怎么收到a键,然后更新内容的
这里直接分析的是App端收到了输入事件.
图1 键盘事件传输如图所示
APP - > IME
- ViewRootImpl中的WindowInputEventReceiver收到Input传递过来的KeyEvent(a)事件
- ViewRootImpl将KeyEvent传递给内置的几个InputStage,
- ImeInputStage将KeyEvent通过NativeInputEventSender中的InputChannel(socket)发送给IME.
- IME对于App发送过来的KeyEvent决定是否consume
IME -> APP
- IME将KeyEvent的consume的结果通过InputChannel再发送给APP
- APP中的NativeInputEventSender收到IME事件,最后会调用到ImeInputStage中的onFinishedInputEventCallback.
- ImeInputStage根据Ime对于KeyEvent的处理结果,决定是否finish或forward
- 本例中LeanbackIme不会consume, 所以ImeInputStage继续将KeyEvent forward到EditText
- 最终EditText.onKeyDown consume掉该keyevent, 更新mText
二. 从键盘上按Enter键
按Enter键后,与上一节不同在于LeanbackIme会消费掉物理Enter键,所以物理按键Enter不会被deliver到EditText, 在ImeInputStage就被finish掉了, 而进入下面的流程。
如图2所示,最终由ViewRootImpl发送虚拟的Enter按键事件,后面的处理流程就一样了,最终EditText会hide IME.
三. 至于一些类,怎么初始化的,不再本节研究之内
image.pngimage.png
网友评论