activity的启动从ActivityThread. main方法开始,该方法里调用preparemainlooper和loop两个方法分别初始化和启动一个looper;那么我们可以理解为后续所有的操作将通过handler来分发;在handmessage回调方法里我们找到what为?的case语句,调用了handlelaunch方法。
handlelaunch方法里面调用了performlaunch方法和handleresume方法。
先看performlaunch,1.先实例化了一个activity对象,2.然后调用其attach方法,在attach方法中创建了一个 Phonewindow,主要负责帮助activity管理view,3.最后调用了activity的OnCreate方法,在activity的OnCreate方法里调用setcontview方法,最终调用了phonewindow的setcontentview方法,在这个方法里,首先创建了 decorview,是顶级view,所有view均继承于他,其次解析传递进去的xml布局文件,并将解析的view添加到decorview中,形成初步具有树形结构的视图。
再看handlresume方法,1.首先调用了onresume方法,此时用户还看不到界面,2.然后调用windowmanager的addview方法,最终调用到windowmanagerglobal的addview方法,这个方法里创建了一个 viewrootimpl,主要负责view的绘制流程,然后调用了viewrootimpl的setview方法,调用requestlayout开始绘制view,并且将viewrootimpl作为decorview的父亲。
然后调用到viewrootimpl的performtravel方法,在该方法里依次调用performmeasure方法,performlayout方法,performdraw方法。