Android中按键消息的派发过程及源码分析(2)

deliverKeyEvent()函数的执行流程如下:

1、调用mView.dispatchKeyEventPreIme(),如果有输入法存在,那么按键消息首先会被派发到输入法窗口,如果想在输入法截获消息之前处理该消息,那么可以重载该函数。

2、imm.dispatchKeyEvent()将消息派发到输入法窗口

3、调用deliverKeyEventPostIme()继而调用到mView.dispatchKeyEvent()

private void deliverKeyEvent(KeyEvent event, boolean sendDone) {           if (ViewDebug.DEBUG_LATENCY) {               mInputEventDeliverTimeNanos = System.nanoTime();           }              if (mInputEventConsistencyVerifier != null) {               mInputEventConsistencyVerifier.onKeyEvent(event, 0);           }              // If there is no view, then the event will not be handled.            if (mView == null || !mAdded) {               finishKeyEvent(event, sendDone, false);               return;           }              if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);              // Perform predispatching before the IME.            if (mView.dispatchKeyEventPreIme(event)) {               finishKeyEvent(event, sendDone, true);               return;           }              // Dispatch to the IME before propagating down the view hierarchy.            // The IME will eventually call back into handleFinishedEvent.            if (mLastWasImTarget) {               InputMethodManager imm = InputMethodManager.peekInstance();               if (imm != null) {                   int seq = enqueuePendingEvent(event, sendDone);                   if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="                           + seq + " event=" + event);                   imm.dispatchKeyEvent(mView.getContext(), seq, event, mInputMethodCallback);                   return;               }           }              // Not dispatching to IME, continue with post IME actions.            deliverKeyEventPostIme(event, sendDone);       }  

private void deliverKeyEventPostIme(KeyEvent event, boolean sendDone) {           ...              // Deliver the key to the view hierarchy.            if (mView.dispatchKeyEvent(event)) {               finishKeyEvent(event, sendDone, true);               return;           }           ...   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psyxy.html