美文网首页
Android Input 3

Android Input 3

作者: wbo4958 | 来源:发表于2019-03-29 10:06 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/uapwvqtx.html