注:-->及缩进表示方法调用层级关系
一、setContentView调用流程
ActivityThread.performLaunchActivity
-->activity.attach
--> new PhoneWindow()
-->mInstrumentation.callActivityOnCreate//内部调用onCreate方法
MainActivity.onCreate()
-->setContentView
二、setContentView源码分析
1. 继承 Activity 的流程
setContentView
-->getWindow().setContentView(layoutResID);//getWindow()得到的是new PhoneWindow()
PhoneWindow.setContentView --- 主要目的 创建 DecorView 拿到 Content
--> installDecor(); // 创建 DecorView 拿到 mContentParent
--> mDecor = generateDecor(-1);
--> new DecorView()
--> mContentParent = generateLayout(mDecor);
--> R.layout.screen_simple --> @android:id/content --> mContentParent
// R.layout.screen_simple --》 添加到 DecorView(FrameLayout)
--> mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);
--> ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
--> mLayoutInflater.inflate(layoutResID, mContentParent); // R.layout.activity_main 渲染到 mContentParent
2. 继承 AppCompatActivity 的流程
setContentView
-->getDelegate().setContentView(view);//getDelegate()得到的是new AppCompatDelegate()
AppCompatDelegate.setContentView
--> ensureSubDecor();
--> mSubDecor = createSubDecor();
--> ensureWindow(); // 从Activity 那PhoneWindow
--> mWindow.getDecorView();
--> installDecor(); // mContentParent
-->... ...//此处与继承Activity的流程一致,省略