- setContentView会调用getWindow().setContentView(),getWindow其实是PhoneWindow对象,在ActivityThread.performLauncherActivity方法反射创建activity的时候会调用activity.attach(),在attach方法里会创建PhoneWindow对象。
- 在PhoneWindow的setContentView里面会判断mContentParent==null,mContentParent也就是那个id=android.R.id.content,如果=null会调用installDecor方法。
- 在installDecor会调用generateDecor方法来创建DecorView,实际上就是一个FrameLayout,接着会调用generateLayout来创建contentParent,创建完之后通过LayoutInflate.inflate解析我们传进来的布局ID,添加到contentParent里面。
AppCompatActivity的setContentView流程
- 调用流程:AppCompatDelegateImpl.setContentView()->ensureSubDecor()->createSubDecor()->mWindow.getDecorView()这里就是调用phoneWindow的getDecorView(),接着会调用installDecor()流程和上面一样创建DecorView和ContentParent。
- 创建了subdecor之后,会获取到通过findViewById获取到android.R.id.content,然后遍历删除子view,添加到subdecor里面,接着设置ID为NO_ID,把subdecor的ID设置为android.R.id.content,最后也是通过LayoutInflate.inflate解析我们传进来的布局ID