时序图预览
activity及其窗口显示流程图
activity的启动流程可参考:activity启动流程图
关键代码分析
ActivityThread 接收框架 (ActivityTaskManagerService ATMS) 回调,开始启动一个新的 Activity,这时候一般情况下新activity将会执行生命周期函数从 onCreate 到 onResume。这个过程大致可分为两部分,第一点是创建窗口 view,并实例化 activity 自身设置的布局。第二点是将属于这个 activity 的 view 树添加到 WMS 中,申请 surface,然后进行内容绘制并将窗口显示在屏幕上。首先看看第一部分,view 树实例化的过程:
ActivityThread
public Activity handleLaunchActivity(ActivityClientRecord r,
PendingTransactionActions pendingActions,
Intent customIntent) {
...
//初始化WindowManagerGlobal,进程单例,用于向WMS添加窗口view
WindowManagerGlobal.initialize();
//执行activity的实例化、attach
final Activity a = performLaunchActivity(r, customIntent);
...
return a;
}
private Activity performLaunchActivity(ActivityClientRecord r,
Intent customIntent) {
...
//创建activity context
ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
//反射实例化要启动的activity
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
} catch (Exception e) {
}
try {
//进程application,一般已经初始化(进程启动阶段 bindApplication,
//回调handleLaunchActivity()之前)
Application app = r.packageInfo.makeApplicationInner(
false, mInstrumentation);
//记录activity实例
synchronized (mResourcesManager) {
mActivities.put(r.token, r);
}
// 初始化activity资源相关类加载器,必须和application context一致
appContext.getResources().addLoaders(
app.getResources().getLoaders().toArray(
new ResourcesLoader[0]));
appContext.setOuterContext(activity);
//初始化activity的成员变量,如window, FragmentController等
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.activityConfigCallback,
r.assistToken, r.shareableActivityToken);
...
//回调activity生命周期 onCreate()
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(
activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(
activity, r.state);
}
//activiy 处于onCreate阶段
r.setState(ON_CREATE);
} catch (SuperNotCalledException e) {
}
return activity;
}
Activity
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,