Android InputStage事件处理流程

发布于:2024-07-07 ⋅ 阅读:(122) ⋅ 点赞:(0)

 InputStage事件处理流程

对于java层的按键分发从ViewRootImpl.java的WindowInputEventReceiver中的onInputEvent开始,InputStage将输入事件的处理分成若干个阶段(Stage), 如果当前有输入法窗口,则事件处理从 NativePreImeInputStage 开始,否则从EarlyPostImeInputStage 开始,流程如下:


@frameworks/base/core/java/android/view/ViewRootImpl.java
WindowInputEventReceiver::onInputEvent
    enqueueInputEvent(event, this, 0, true);
        if (processImmediately) { doProcessInputEvents(); }
            deliverInputEvent(q);  //在deliverInputEvent函数中做输入事件的实际分发
                stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;  //这里开始选择 责任链的入口
                stage.deliver(q);  //这里主要调用InputStage的deliver方法进行分发,InputStage代表了输入事件的处理阶段,使用责任链模式 设计模式。
                    result = onProcess(q);
                        NativePreImeInputStage::onProcess
                            ViewPreImeInputStage::onProcess
                                processKeyEvent(q);
@frameworks/base/core/java/android/view/View.java
                                    mView.dispatchKeyEventPreIme(event)
                                        return onKeyPreIme(event.getKeyCode(), event);  //View系列控件可以直接复写onKeyPreIme
                                ImeInputStage::onProcess
@frameworks/base/core/java/android/view/ImeFocusController.java                                
                                    final int result = mImeFocusController.onProcessImeInputStage(q, q.mEvent, mWindowAttributes, this);
@frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
                                        imm.dispatchInputEvent(event, token, callback, mViewRootImpl.mHandler);  //InputMethodManager的dispatchInputEvent方法处理消息
                                    EarlyPostImeInputStage::onProcess
                                        NativePostImeInputStage::onProcess
                                            ViewPostImeInputStage::onProcess
                                                SyntheticInputStage::onProcess
                        


网站公告

今日签到

点亮在社区的每一天
去签到