ViewRootImpl的setView()函数中(这个函数被调用代表着Activity的界面基本建立)会建立一群InputStage并以职责链模式链接起来进行协同工作:
- syntheticInputStage
- viewPostImeStage
- nativePostImeStage
- earlyPostImeStage
- imeStage
- viewPreImeStage
- nativePreImeStage
- 上面的优先级是倒序的,mFirstInputStage = nativePreImeStage是地一个InputStage,而mFirstPostImeInputStage = earlyPostImeStage.
QueuedInputEvent: 代表着一个等待被处理的输入事件,可能是任何输入
- 一般来说,event都是被串行处理的,分法者每次会向application传递一个Event并且在其处理完成以后投递下一个.
- 因为application或者IME可以合成或者添加多个event在同一时间内,因此在application端就不再有这样一个队列。
mFirstPostImeInputStage和mFirstInputStage会在deliverInputEvent(…)中被使用: InputStage stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;
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中将事件传递下去.
ViewRootHandler extends Handler 中的handleMessage对MSG_DISPATCH_INPUT_EVENT/MSG_DISPATCH_KEY_FROM_IME会进行enqueueInputEvent的处理,
PhoneWindow的injectInputEvent(…) 会调用到ViewRootImpl的dispatchInputEvent. 但是一般来说应该是WindowInputEventReceiver(构造时传入了UIThread 的Handler)接受到onInputEvent并将其enqueue
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构造时就会被调用(传
Android InputEvent(Motion/Key/Sleep....) 流程跟踪
最新推荐文章于 2024-07-03 19:34:29 发布
本文详细剖析了Android系统中输入事件的处理流程,从ViewRootImpl的InputStage建立,到QueuedInputEvent的传递,深入讲解了键盘事件的处理、事件队列以及InputEventReceiver在native层的角色。涉及关键类如ViewPreImeInputStage、InputStage、InputEventReceiver,以及事件从应用到系统的层层分发机制。
摘要由CSDN通过智能技术生成