????????event????????????????????????????????????sendDone????ü??????????????????????????????????????????????

????ViewRoot?????????mView?????????????????????????????????DecorView????ViewRoot?????????deliverKeyEvent???????????????????dispatchKeyEventPreIme???????????????????????event??????????????????????DecorView???????????dispatchKeyEventPreIme??????handled????true????????????event???????????????????????????ViewRoot?????????deliverKeyEvent????????????????????????£????????sendDone???????true?????ViewRoot?????????deliverKeyEvent???????????????ó??????finishInputEvent?????????????????????????????????????????????????????????????????Step 2??Step 4?У????????????????????????????????????????????????

???????貳???????????????????event??????????????????????ViewRoot?????????deliverKeyEvent???ü???????????????????????????????????????

????1. ????InputMethodManager????????????peekInstance???????????InputMethodManager??????????imm;

????2. ????ViewRoot?????????enqueuePendingEvent??????event??????????????????????????????????????ü?????????????????????д???;

????3. ?????1????????????????imm????????dispatchKeyEvent????????event????????????????????????????

???????????????????????????????????????е???????????????????????£?ViewRoot?????????deliverKeyEvent???????event??????????????????????????????????????ViewRoot?????????mLastWasImTarget?????????true?????????????????????????event??????????????????????????????ViewRoot?????????deliverKeyEvent????????????????InputMethodCallback???????????????????????????????event????????????????????????????????????????finishedEvent??????????????????????????????????????InputMethodCallback????????????ViewRoot?????????mInputMethodCallback?У?????????????finishedEvent?????????????????ViewRoot?????????deliverKeyEventToViewHierarchy????????????event???????????????????????????

????????????????????????????????ViewRoot?????????mLastWasImTarget???????false?????ViewRoot?????????deliverKeyEvent???????ó??????deliverKeyEventToViewHierarchy????????event???????????????????????????

????????????????????????????????????????????????????????????????????????????????????

??????????????????????ViewRoot?????????deliverKeyEvent?????????DecorView?????????dispatchKeyEventPreIme???????????????????????????????????????DecorView?????????dispatchKeyEventPreIme??????ViewGroup???????????????????????????????ViewGroup?????????dispatchKeyEventPreIme??????

????Step 2. ViewGroup.dispatchKeyEventPreIme

????[java] view plaincopyprint?

????public abstract class ViewGroup extends View implements ViewParent?? ViewManager {

????......

????// The view contained within this ViewGroup that has or contains focus.

????private View mFocused;

????......

????@Override

????public boolean dispatchKeyEventPreIme(KeyEvent event) {

????if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) {

????return super.dispatchKeyEventPreIme(event);

????} else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) {

????return mFocused.dispatchKeyEventPreIme(event);

????}

????return false;

????}

????......

????}

????public abstract class ViewGroup extends View implements ViewParent?? ViewManager {

????......

????// The view contained within this ViewGroup that has or contains focus.

????private View mFocused;

????......

????@Override

????public boolean dispatchKeyEventPreIme(KeyEvent event) {

????if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) {

????return super.dispatchKeyEventPreIme(event);

????} else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) {

????return mFocused.dispatchKeyEventPreIme(event);

????}

????return false;

????}

????......

????}

????????????????????frameworks/base/core/java/android/view/ViewGroup.java?С?