????PhoneWindow?????????getCallback??????Window??????????????????????Window.Callback????????Activity?????????????Window.Callback????????????Window.Callback???????????????????????PhoneWindow???????????????????PhoneWindow????????????????????????ü???????????????????????Activity????????

????DecorView?????????mFeatureId???????????????????DecorView??????????????????С??0??????????????????????DecorView?????????????????Activity?????????????????

?????????????????????DecorView???????????????Activity???????????????????????Activity???????????Window.Callback??????DecorView?????????dispatchKeyEvent??????Window.Callback??????????dispatchKeyEvent?????????Activity?????????????????????????????????????event????????????????????????????????DecorView????????????????????????????DecorView??????View????????dispatchKeyEvent???????

??????????赱?????????DecorView???????????????Activity???????????????????????Activity???????????Window.Callback???????????event??????????????????????????Activity?????????????Activity????????????????????????????ü???????????????????????????????????????????Window.Callback??????????dispatchKeyEvent??????handled?????false???????DecorView?????????dispatchKeyEvent???ü??????????????????????DecorView???????????????PhoneWindow???????????onKeyDown????onKeyUp???????????????isDown?????true????false??????????????????????????????й??????????????й??

????PhoneWindow?????????onKeyDown??onKeyUp?????????????Щ???????????????綽??????????????????????Щ?????????????磬?????μ綽??????????????;???磬??????????????????????????С??

???????????????????????Activity????????Window.Callback??????????dispatchKeyEvent???????????????????????Activity???????????????

????Step 7. Activity.dispatchKeyEvent

????[java] view plaincopyprint?

????public class Activity extends ContextThemeWrapper

????implements LayoutInflater.Factory??

????Window.Callback?? KeyEvent.Callback??

????OnCreateContextMenuListener?? ComponentCallbacks {

????......

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

????......

????Window win = getWindow();

????if (win.superDispatchKeyEvent(event)) {

????return true;

????}

????View decor = mDecor;

????if (decor == null) decor = win.getDecorView();

????return event.dispatch(this?? decor != null

????? decor.getKeyDispatcherState() : null?? this);

????}

????......

????}

????public class Activity extends ContextThemeWrapper

????implements LayoutInflater.Factory??

????Window.Callback?? KeyEvent.Callback??

????OnCreateContextMenuListener?? ComponentCallbacks {

????......

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

????......

????Window win = getWindow();

????if (win.superDispatchKeyEvent(event)) {

????return true;

????}

????View decor = mDecor;

????if (decor == null) decor = win.getDecorView();

????return event.dispatch(this?? decor != null

????? decor.getKeyDispatcherState() : null?? this);

????}

????......

????}

????????????????????frameworks/base/core/java/android/app/Activity.java?С?

????Activity?????????getWindow?????????????????Activity??????????????PhoneWindow????Activity?????????dispatchKeyEvent????????PhoneWindow??????????????????????superDispatchKeyEvent?????????????event??????????????????????????

???????PhoneWindow???????????????event????????????????????????ü??????????????·???????Activity?????????dispatchKeyEvent???ü??????????????????????Activity??????????????????ò???event???????????KeyEvent???????????dispatch???????

????????????event???????????KeyEvent???????????dispatch?????????????????????????????Activity????????????KeyEvent.Callback????????event?????????KeyEvent???????????dispatch????е?????У??????????????KeyEvent.Callback??????????onKeyDown??onKeyUp????onKeyMultiple??????????????????????????????????Activity?????????onKeyDown??onKeyUp????onKeyMultiple?????????event??????????????????????????????????Activity??????????????????????Activity?????????????????????д????Activity????????onKeyDown??onKeyUp????onKeyMultiple??