????ViewRoot?????????deliverKeyEventToViewHierarchy?????????event??????????????????????????????????????????????????????ViewRoot?????????mView???????????DecorView???????????dispatchKeyEvent???????

????????????????????????????????????event?????????????????????ü???????????????ViewRoot?????????deliverKeyEventToViewHierarchy??????????????DecorView?????????dispatchKeyEvent?????????keyHandled????????false????????????£????????event??????????????μ???????????????isDown???????true?????ViewRoot?????????deliverKeyEventToViewHierarchy???????????event??????????????DPAD???????????????????????????????????????????

???????????event???????????DPAD?????????????????direction??????????0?????????????????????μ?????????????DPAD????????????????????????????????????????ViewRoot?????????mView???????????DecorView???????????findFocus??????focused??????null???????????????????direction???????????????????????????????磬???????direction???????View.FOCUS_LEFT??????????????????????focused???????????????????????????????????????????????????????????????focused????????focusSearch???????

??????????????????????????v????????????????????????????focused?????ViewRoot?????????deliverKeyEventToViewHierarchy??????????v??????????????????????????????v???????????View???????????requestFocus???????

????????????????????event???????????????????????????????????sendDone???????true????????????????????????????????event??????????????????????????????????????ViewRoot?????????finishInputEvent???????

???????????????????????DecorView?????????dispatchKeyEvent????????????????????????????????????????

????Step 6. DecorView.dispatchKeyEvent

????[java] view plaincopyprint?

????public class PhoneWindow extends Window implements MenuBuilder.Callback {

????......

????private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {

????......

????@Override

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

????final int keyCode = event.getKeyCode();

????final boolean isDown = event.getAction() == KeyEvent.ACTION_DOWN;

????......

????final Callback cb = getCallback();

????final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event)

????: super.dispatchKeyEvent(event);

????if (handled) {

????return true;

????}

????return isDown ? PhoneWindow.this.onKeyDown(mFeatureId?? event.getKeyCode()?? event)

????: PhoneWindow.this.onKeyUp(mFeatureId?? event.getKeyCode()?? event);

????}

????......

????}

????......

????}

????public class PhoneWindow extends Window implements MenuBuilder.Callback {

????......

????private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {

????......

????@Override

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

????final int keyCode = event.getKeyCode();

????final boolean isDown = event.getAction() == KeyEvent.ACTION_DOWN;

????......

????final Callback cb = getCallback();

????final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event)

????: super.dispatchKeyEvent(event);

????if (handled) {

????return true;

????}

????return isDown ? PhoneWindow.this.onKeyDown(mFeatureId?? event.getKeyCode()?? event)

????: PhoneWindow.this.onKeyUp(mFeatureId?? event.getKeyCode()?? event);

????}

????......

????}

????......

????}

????????????????????frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java?С?