Android源码解析系列1——Activity启动和界面加载(1)

// 省略部分代码
} 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;
}

上述代码主要执行了以下操作:

  1. 创建Activity对象

调用InstrumentationnewActivity方法,通过反射创建Activity对象。

  1. 初始化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();
// 省略部分代码
}
// 省略部分代码
}

  1. 调用3个生命周期方法

1、Instrumentation.callActivityOnCreate方法,该方法中会调用activity.performCreate()方法。
2、activity.performStart()方法。
3、Instrumentation.callActivityOnPostCreate方法,该方法中会调用activity.onPostCreate()方法。

查看里面的源码,确实依次调用了onCreateonStartonPostCreate方法,验证了我们之前对performLaunchActivity的猜想。

总结一下

handleLaunchActivity方法里,会回调以下生命周期:

onCreate() -&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值