在Android程序的入口是从ActivityThread.main 函数开始执行。
在ActivityThread. performLaunchActivity()这个函数创建出了Activity对象,ContextImpl对象,PhoneWindow对象,WindowManager对象。再进去该函数看看:
public final class ActivityThread {
......
private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity activity = null;
try {
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);//创建出Activity
r.intent.setExtrasClassLoader(cl);
if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) {
}
try {
......
if (activity != null) {
ContextImpl appContext = new ContextImpl();//创建ContextImpl对象
appContext.init(r.packageInfo, r.token, this);
appContext.setOuterContext(activity);//向ContextImpl对象的mContext成员变量赋值 指向当前Activity。
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
Configuration config = new Configuration(mConfiguration);
.......
//在这个函数里面,在前面的文章分析过,主要的操作
//保存ContextImpl对象在Activity的父类mBase成员变量中
//创建出PhoneWindow对象
//创建WindowManagerImpl对象,LocalWindowManager对象
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstance,
r.lastNonConfigurationChildInstances, config);
......
//@#$@$%$%%@¥¥*&¥
mInstrumentation.callActivityOnCreate(activity, r.state);
.......
}
.......
} catch (SuperNotCalledException e) {
} catch (Exception e) {
}
return activity;
}
}
这里主要看40行, 调用了这个函数 mInstrumentation.callActivityOnCreate(activity, r.state),进去该函数看看:
public class Instrumentation {
......
public void callActivityOnCreate(Activity activity, Bundle icicle) {
......
activity.onCreate(icicle);
......
}
.......
}
从这里看出回调到,Activity.onCreate函数。进去看看该函数:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
......
protected void onCreate(Bundle savedInstanceState) {
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, false);
mCalled = true;
}
......
}
没有特别的,就初始化了一些参数。:
我们在实现一个Activity组件的时候,也就是在实现一个Activity子类的时候,一般都会重写成员函数onCreate。
让我们来实现一个Activity子类。
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
我们创建一个Activity,都是在继承Activity,或者继承Activity的子类,在 mInstrumentation.callActivityOnCreate()
函数里,调用的activity.onCreate(savedInstanceState)函数其实就是在回调了我们实现Activity子类。
至此,我们已经分析到,回调我们定义的Activity子类OnCreate的方法了,通常我们一般都会在onCreate方法里调用
setContentView(R.layout.main);方法,正如MainActivity类那样。这个方法的调用的,就创建DecorView即Android应用程序窗口视图,
几个操作最重要的:
- 创建Activity
- 创建ContextImpl
- 创建PhoneWindow
- 创建WindowManagerImpl
- 回调Activity.onCreate()函数
通过一张时序图来总结这些重要操作创建的流程:
在时序图的第四步,创建了PhoneWindow,再去看看PhoneWindow创建的时序图: