从ThreadActivity类的handleLaunchActivity方法开始,先调用performLaunchActivity,在这个方法中调用了Activity的attach方法。attach方法中对window进行了初始化,具体类型是PhoneWindow。创建完window后,activity会实现对应的callback方法来监听window相关的事件。在PhoneWindow创建完后会初始化其中的一些变量,例如WindowManager(也就是PhoneWindow中新建了一个WindowManager,其类型是WindowManagerImpl,而WindowManagerImpl中保存了从WindowManagerService获取的windowManagerService)。
如果上面performLaunchActivity方法的返回值不为空,会执行handleResumeActivity方法。在这个过方法中会调用到PhoneWindow的getDecor方法,用于新建DecorView。新建完DecorView后会调用WindowManager的addView方法(实际上是WindowManagerImpl的addView)将DecorView添加到window中。具体过程是这样的:
1.调用WindowManagerGlobal的addView方法。
2.创建ViewRootImpl对象。
3.将DecorView,ViewRootImpl,layoutparams保存起来。
4.调用ViewRootImpl的setView方法,绑定DecorView。
5.setView中调用requestLayout(scheduleTraversals,最终会走到performTraversals)来开始对整个View的测量及绘制。
6.requestLayout之后会调用mWindowSession(在WindowManagerGlobal中初始化)的addToDisplay方法,该方法是一个IPC方法,最终将window添加到屏幕上。
Activity中的setContentView实际调用的是PhoneWindow中的setContentView方法。大概就是把xml文件中的View填充到mContentParent中去。