一、Activity#setContentView中的xml文件是如何转化成View并显示到Activity中的
1.在setContentView里面,通过getWindow获得了当前activity的phoneWindow
窗口;
2.调用的PhoneWindow中的setContentView,并在里面调用了mLayoutInflater.inflate(layoutResID, mContentParent)
方法,
3.将xml的布局填充到DecorView
上面,看源码里会有一个screen_simple
的xml文件,其中又一个FrameLayout
,我们的布局都是装载在这个Framelayout中,最终会回附加到DecorView上面
二、PhoneWindow是在什么时候创建的
PhoneWindow对象的创建是在Activity对象创建之后创建的,而Activity对象的创建在ActivityThread.performLaunchActivity()方法才完成创建的
public final class ActivityThread {
private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity activity = null;
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);//创建Activity对象
......
if (activity != null) {
ContextImpl appContext = new ContextImpl();//创建Context对象
appContext.setOuterContext(activity);//在ContextImpl类中保存当前Activity对象,以便在ContextImpl能操作Activity组件。
......
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstance,
r.lastNonConfigurationChildInstances, config);
......
return activity;
}
}
网友评论