// 省略部分代码
} catch (Exception e) { /* 省略部分代码 */ }
try {
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
// 省略部分代码
if (activity != null) {
// 省略部分代码
Window window = null;
if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
window = r.mPendingRemoveWindow;
r.mPendingRemoveWindow = null;
r.mPendingRemoveWindowManager = null;
}
appContext.setOuterContext(activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback);
// 省略部分代码
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
// 省略部分代码
if (!r.activity.mFinished) {
activity.performStart();
r.stopped = false;
}
if (!r.activity.mFinished) {
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnPostCreate(activity, r.state,
r.persistentState);
} else {
mInstrumentation.callActivityOnPostCreate(activity, r.state);
}
// 省略部分代码
}
}
r.paused = true;
// 保存ActivityClientRecord
mActivities.put(r.token, r);
} catch { /* 省略catch相关代码 */ }
return activity;
}
上述代码主要执行了以下操作:
- 创建Activity对象
调用Instrumentation
的newActivity
方法,通过反射创建Activity对象。
- 初始化Activity
调用Activity对象的attach
方法,用于初始化Activity的一些数据,同时会为Activity设置Window
对象。 注意
:Activity的Window对象,与传入的Window对象不是同一个对象。这也意味着:每个Activity都有各自的Window对象
。
public class Activity extends … {
// 省略部分代码
private Window mWindow;
private WindowManager mWindowManager;
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor,
Window window, ActivityConfigCallback activityConfigCallback) {
attachBaseContext(context);
mFragments.attachHost(null /parent/);
mWindow = new PhoneWindow(this, window, activityConfigCallback);
// 省略部分代码
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
// 省略部分代码
mWindowManager = mWindow.getWindowManager();
// 省略部分代码
}
// 省略部分代码
}
- 调用3个生命周期方法
1、
Instrumentation.callActivityOnCreate
方法,该方法中会调用activity.performCreate()
方法。
2、activity.performStart()
方法。
3、Instrumentation.callActivityOnPostCreate
方法,该方法中会调用activity.onPostCreate()
方法。
查看里面的源码,确实依次调用了onCreate
、onStart
、onPostCreate
方法,验证了我们之前对performLaunchActivity的猜想。
总结一下:
在handleLaunchActivity
方法里,会回调以下生命周期:
onCreate()
-&