Activity 的 setContentView
getWindow().setContentView(layoutResID);
Activity 的getWindow
return mWindow;
Activity 的attach
mWindow = new PhoneWindow(this, window, activityConfigCallback);
很明显Activity 的 setContentView最终调用的是PhoneWindow的setContentView
PhoneWindow的 setContentView
初始化了DecorView,(DecorView实际上是一个 FrameLayout),在 DecorView 中默认自带一个 mContentParent(实际上是一个 ViewGroup)。我们自己实现的布局是被添加到 mContentParent 中的。
PhoneWindow的setContentView完成了DecorView和界面布局的初始化
onCreate 阶段只是初始化了 Activity 需要显示的内容,而在 onResume 阶段才会将 PhoneWindow 中的 DecorView 真正的绘制到屏幕上。
在 ActivityThread 的 handleResumeActivity 中,会调用 WindowManager 的 addView 方法将 DecorView 添加到 WMS(WindowManagerService) 上
WindowManager 的 addView
初始化ViewRootImpl ,调用setView
ViewRootImpl 的 setView做了三件事
1、调用requestLayout 刷新布局,调用此方法后 ViewRootImpl 所关联的 View 也执行 measure - layout - draw 操作;
2、调用 mWindowSession 的 addToDisplay 方法将 View 添加到 WMS 中;
3、设置输入事件的处理
ViewRootImpl 显示布局和设置事件处理