PhoneWindow.setContentView
mContentParent:
这是放置窗口内容的视图。要么是mdecor本身,或内容所在的mdecor的子级。
mDecor:
窗口的顶级视图,包含window decor
1.如果mContentParent为空,初始化installDecor
【1】如果mDecor为null,调用generateDecor,new DecorView(context, featureId, this, getAttributes())
【2】如果mDecor不为null,将当前的phonewindow对象设置给他mDecor.setWindow(this);
【3】如果mContentParent为null,调用generateLayout,
ViewGroup contentParent=(ViewGroup)findViewById(ID_ANDROID_CONTENT)
2.如果mContentParent不为空,将所有的子View移除
3.mLayoutInflater.inflate(layoutResID, mContentParent);把传入的View添加到mContentParent
4.mContentParentExplicitlySet设置为true,在requestFeature中,如果mContentParentExplicitlySet为true就会抛出异常,所以requestFeature一定要在setContentView之前调用
以上仅仅是分析了,初始化decorview,以及它的子布局,但是好像和activity的window没有关联性,我们找到activityThread当中的handleResumeActivity方法,
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
…
if (a.mVisibleFromClient) {
if (!a.mWindowAdded) {
a.mWindowAdded = true;
wm.addView(decor, l);
…
也就是说在activity的onResume生命周期调用的时候,关联起来
同时还在源码中发现:
Looper.myQueue().addIdleHandler(new Idler());
也就是说,IdleHandler也是在onResume声明周期的时候调用
网友评论