Android InputEvent(Motion/Key/Sleep....) 流程跟踪

  1. ViewRootImpl的setView()函数中(这个函数被调用代表着Activity的界面基本建立)会建立一群InputStage并以职责链模式链接起来进行协同工作:

    • syntheticInputStage
    • viewPostImeStage
    • nativePostImeStage
    • earlyPostImeStage
    • imeStage
    • viewPreImeStage
    • nativePreImeStage
    • 上面的优先级是倒序的,mFirstInputStage = nativePreImeStage是地一个InputStage,而mFirstPostImeInputStage = earlyPostImeStage.
  2. QueuedInputEvent: 代表着一个等待被处理的输入事件,可能是任何输入

    • 一般来说,event都是被串行处理的,分法者每次会向application传递一个Event并且在其处理完成以后投递下一个.
    • 因为application或者IME可以合成或者添加多个event在同一时间内,因此在application端就不再有这样一个队列。
  3. mFirstPostImeInputStage和mFirstInputStage会在deliverInputEvent(…)中被使用: InputStage stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;

  4. ViewRootImpl中的ViewPreImeInputStage extends InputStage

    • onProcess(QueuedInputEvent q)被Override,只有在q.mEvent instanceof KeyEvent时才会调用processKeyEvent(q), 否则直接返回FORWARD将QueuedInputEvent传递下去.
    • processKeyEvent(QueuedInputEvent q), 调用 mView(即为Activity的最外层View,基本就是DecorView).dispatchKeyEventPreIme(event),并返回FINISH_HANDLED代表着处理了该Event,如果dispatchKeyEventPreIme返回false, 那么就返回FORWARD以在onProcess中将事件传递下去.
  5. ViewRootHandler extends Handler 中的handleMessage对MSG_DISPATCH_INPUT_EVENT/MSG_DISPATCH_KEY_FROM_IME会进行enqueueInputEvent的处理,

  6. PhoneWindow的injectInputEvent(…) 会调用到ViewRootImpl的dispatchInputEvent. 但是一般来说应该是WindowInputEventReceiver(构造时传入了UIThread 的Handler)接受到onInputEvent并将其enqueue

  7. WindowInputEventReceiver extends InputEventReceiver, 其onInputEvent(…)会被dispatchInputEvent(…)(该方法没有被WindowInputEventReceiver Override)调用,而后者则会在native层被调用.

    • NativeInputEventReceiver::consumeEvents(…)会调用Java层的dispatchInputEvent(…).
    • consumeEvents(…)的调用者则是handleEvent(int receiveFd, int events, void* data)调用.
    • native层的nativeInit(…)则是Java层的nativeInit(…)的native实现.
    • nativeInit(…)在InputEventReceiver构造时就会被调用(传
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值