- Key Event 在View 树里的分发流程:
- 1.ViewRootImpl#processKeyEvent(),这个方法可以看作是按键入口
- 2.View#dispatchKeyEvent(),将键传递给视图层次结构。
- 3.DecorView#dispatchKeyEvent(),DecorView是Android中页面的根容器布局,因此看它的分发流程
- 4.Window#dispatchKeyEvent,每个页面都是一个Window窗口,DecorView将keyEvent分发到Window
- 5.AppCompatActivity#dispatchKeyEvent(),这个是activity分发操作
- 6.KeyEventDispatcher#dispatchKeyEvent(),这个里面判断activity,dialog等方式,以便分发到对应的组件上
- 7.KeyEventDispatcher#activitySuperDispatchKeyEventPre28(),这里主要看activity,可以看到调用了superDispatchKeyEvent传递到window,如果window没处理则调用Decor分发。
- 8.最终可以发现,处理KeyEvent事件,可以是Window,Activity,View。
- 总结按键消息分发流程:
- 1.分发时使用的主要方法名为dispatchKeyEvent,superDispatchKeyEvent等名字,虽然这些方法可以被覆盖,但设计的目的不是用于接收KeyEvent的,用于接收KeyEvent的方法名有onKeyDown,onKeyUp,onKeyLongPress,onKeyMultiple
- 2.分发时的主要路径 DecorView.dispatchKeyEvent-> PhoneWindow.dispatchKeyEvent->DecorView.superDispatchKeyEvent -> ViewGroup.dispatchKeyEvent 这时候就会在ViewTree中调用dispatchKeyEvent,先找到focusView的最父级调用dispatchKeyEvent,然后再找下一级,最终找到focus view,并调用它的dispatchKeyEvent,然后再调用focus view的onKeyDown等事件,这时候才想让View接收KeyEvent
- 3.所以如果没有拦截dispatchKeyEvent的话,从接收KeyEvent的角度来看,最先可接收KeyEvent的是focus view,然后是View的UnhandledKeyEvent,然后才是Activity,然后才是Window,最后才是ViewRootImpl的焦点导航处理
- 4.从分发的角度来看,最先到达DecorView,然后是Activity,然后是KeyEventDispatcher,然后是PhoneWindow,然后是回到DecorView,然后在ViewTree中分发,沿着找focus view的路径分发,最终找到focus view进行分发