还是不能偏题,其实这样的一个面试问题,确实是一个较为普遍的问题,我相信同类型的文章,网上一搜也是比比皆是,而且简单看一下关注度就能知道有多少人倒在了这种源码类型的面试上。
一般情况下,事件列都是从用户按下(ACTION_DOWN)的那一刻产生的,不得不提到,三个非常重要的与事件相关的方法。
- dispatchTouchEvent()
- onTouchEvent()
- onInterceptTouchEvent()
Activity 的事件分发机制
从英文单词中已经很明显的知道,dispatchTouchEvent()
是负责事件分发的。当点击事件产生后,事件首先会传递给当前的 Activity,这会调用 Activity 的 dispatchTouchEvent()
方法,我们来看看源码中是怎么处理的。
注意截图中,我增加了一些注释,便于我们更加方便的理解,由于我们一般产生点击事件都是 MotionEvent.ACTION_DOWN
,所以一般都会调用到 onUserInteraction()
这个方法。我们不妨来看看都做了什么。
很遗憾,这个方法实现是空的,不过我们可以从注释和其他途径可以了解到,该方法主要的作用是实现屏保功能,并且当此 Activity 在栈顶的时候,触屏点击 Home、Back、Recent 键等都会触发这个方法。
再来看看第二个 if 语句,getWindow().superDispatchTouchEvent()
,getWindow()
明显是获取 Window
,由于 Window
是一个抽象类,所以我们能拿到其子类 PhoneWindow
,我们直接看看 PhoneWindows.superDispatchTouchEvent()