- 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


setContentView方法在Android应用中用于设置活动的视图内容。它会涉及到PhoneWindow对象的创建,通过installDecor和generateDecor方法生成DecorView,这是一个FrameLayout。然后,通过LayoutInflate.inflate解析并添加布局到contentParent。对于AppCompatActivity,流程类似,但会创建subdecor,并处理子view的添加和ID的设定。
1万+

被折叠的 条评论
为什么被折叠?



