Android Input 3

写这篇笔记记录一下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 Enter键处理

如图2所示,最终由ViewRootImpl发送虚拟的Enter按键事件,后面的处理流程就一样了,最终EditText会hide IME.

三. 至于一些类,怎么初始化的,不再本节研究之内

image.png

image.png

你可能感兴趣的:(Android Input 3)