- 首先我们知道dispatchTouchEvent()是由父View传给子View的一级一级分发到子View,这样我们就知道事件是由我们定义的最外层View传递过来的
打开Android Studio 运行一个项目 然后选择Android Studio上方的Tools -> Layout Inspector -> 选择你的项目,然后会生成一个li文件
在View Tree可以清楚的看见你的页面布局结构,图中蓝色的部分就是setContentView
的布局文件 我们看到除了自己的布局文件外,还有一些系统定义的布局,在这些布局中,最外层的View就是DecorView
根据事件分发的机制可以知道,事件是最外层View 即DecorView
分发给子View的
2. 那又是谁分发给DecorView
的呢?
要解决这个问题,就要问DecorView
有没有父View了吗? 看上面那张图,发现DecorView
确实没有父View了,但是他却有个抽象父亲ViewRootImpl
看View的源码
//指定View的父亲
void assignParent(ViewParent parent) {
if (mParent == null) {
mParent = parent;
} else if (parent == null) {
mParent = null;
} else {
throw new RuntimeException("view " + this + " being added, but"
+ " it already has a parent");
}
}
那就看ViewRootImpl
有没有指定父亲 ,请看ActivityThread
源码,来一步一步看是如何设置的 ActivityManagerService
通过进程间通信,执行ApplicationThread
的scheduleResumeActivity()
->sendMessage
->H
handller->handleResumeActivity()
final void handleResumeActivity(IBinder token,
boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
//省略
ActivityClientRecord r = mActivities.get(token);
r = performResumeActivity(token, clearHide,