本文简单介绍一下 Activity 中setContentView 流程, 上图先
[img]http://dl.iteye.com/upload/attachment/564875/053c3985-ecc7-369d-9483-ae3e6db20a3b.png[/img]
首先 Activity 中代码片段
PoliceManager中代码片段
再看Policy类中的代码
从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.
PhoneWindow代码片段
其中callback 实在 activity 的attach方法中设置的
综上 最终所有的view都是add在了mContentParent之上, mContentParent是一个ViewGroup的对象。
[img]http://dl.iteye.com/upload/attachment/564875/053c3985-ecc7-369d-9483-ae3e6db20a3b.png[/img]
首先 Activity 中代码片段
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
public Window getWindow() {
return mWindow;
}
final void attach {
mWindow = PolicyManager.makeNewWindow(this);
}
PoliceManager中代码片段
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
再看Policy类中的代码
public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}
从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.
PhoneWindow代码片段
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged();
}
}
其中callback 实在 activity 的attach方法中设置的
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
综上 最终所有的view都是add在了mContentParent之上, mContentParent是一个ViewGroup的对象。