这是一篇很底层的View的创建分析,从Activity的创建一路讲到View的创建。从底层告诉你 为什么不能在子线程里面更新UI。
我们知道在onCreate里面View还是没有测绘完成的。那么什么时候测绘完成了?答案是onResume。
通过查看源码 我们可以看到在onCreate方法里面调用了getWindow()方法然后在将我们的页面塞到这个window里面。这个window也就是PhonwWindow.
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
那PhoneWindow是什么时候被创建的?
这就引出了Activity的创建流程。
那Activity是怎么被创建的呢?
由于Activity是一个组件他是由系统使用ActivityThread方法去创建的。
现在我来分析下:
先来到ActivityThread类的handleLaunchActivity方法。
在这里我们可以看到他去创建了一个Activity。现在继续跟进去(performLaunchActivity)。
在这里可以看到通过反射的方式创建了Activity。
同样在performLaunchActivity方法里的第3243行:
去调用了callActivityOnCreate方法:继续跟进去:
可以看到他去调用了Activity的performCreate方法。
现在我们终于看到onCreate方法被调用了。
这里还有个重点,在performLaunchActivity里面去调用Activity的onCreate方法之前还去做了一件很重要的事情,这个事情在第3224行:调用了Activity的attach方法。
现在跟到Activity的attach方法:找到了我们一直找的PhoneWindow的创建。