Android InputStage事件处理流程

 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
                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛文旺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值