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