在讲本流程前默认你已经懂了Activity的启动流程
接Activity的启动流程 在AMS binder驱动返向 transact 后

image.png
在 ApplicationThreadNative(应用进程)Binder收到回调onTransact

image.png
调用 ApplicationThread的scheduleLaunchActivity

image.png

image.png

image.png
Ui线程Handler处理消息

image.png
android.app.ActivityThread#handleLaunchActivity

image.png
Activity a = performLaunchActivity(r, customIntent); 有兴趣的可以点击这个方法看看,这里是借助 Instrumentation的协调产出了一个Activity 并且调用了Activity的 attach方法
在Activity中的 attach方法中做了一些绘制的准备工作
1、PhoneWindow的创建
2、并给PhonwWindow设置了windowManager
然后绘制流程开始的函数handleResumeActivity出现了

image.png

image.png
ViewManger或者说WindowManger的实现类是 WindowManagerImpl 进入到它的

image.png
因为前面在 ActivityThread中 WindowManagerGlobal已经初使化好了所以上面可以直接调用了
下面调用了ViewRootImpl的 setLayoutParams

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png
所以你说View绘制的顺序是measure、layout、draw是没有问题的。
还有个问题就是在ViewRootImpl setLayoutParams的时候 调用了一下

image.png
这里有checkThread()

image.png
为什么在Activity的onCreate中开启一个子线程给一个TextView设置文本不会崩溃

image.png
如果延迟个1秒就崩溃了呢?
这是因为如果以极快的速度在onCreate里子线程更新ui时View还没有开始绘制流程不存在checkThread()