diff --git a/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md b/blogs/Android/Framework/源代码情景分析/根 Activity 组件的启动过程.md similarity index 94% rename from blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md rename to blogs/Android/Framework/源代码情景分析/根 Activity 组件的启动过程.md index 0f11f80..1e2980c 100644 --- a/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md +++ b/blogs/Android/Framework/源代码情景分析/根 Activity 组件的启动过程.md @@ -1,5 +1,5 @@ --- -Activity 组件的启动过程 +根 Activity 组件的启动过程 --- #### 根 Activity 组件的启动过程 @@ -485,6 +485,20 @@ private final Activity performLaunchActivity(ActivityClientRecord r, Intent inte activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent); Application app = r.packageInfo.makeApplication(false, mInstrumentation); + ContextImpl appContext = new ContextImpl(); + appContext.init(r.packageInfo, r.token, this); + appContext.setOuterContext(activity); + activity.attach(appContext, this, ...); + mInstrumentation.callActivityOnCreate(activity, r.state); + mActivities.put(r.token, r); + return activity; } ``` +首先通过 Instrumentation newActivity 创建一个 Activity,在实例化一个 ContextImpl,调用 Activity 的 attach 函数,最后再通过 Instrumentation 去调用 Activity 的 onCreate 方法。 + +Activity 对象 activity 启动完成之后,就会以 ActivityClientRecord 对象 r 的成员变量 token 为关键字,将 ActivityClientRecord 对象 r 保存在 ActivityThread 类的成员变量 mActivities 中。 + +ActivityClientRecord 对象 r 的成员变量 token 是一个 Binder 代理对象,它指向了 ActivityManagerService 内部的一个 ActivityRecord 对象。这个 ActivityRecord 对象和 ActivityClientRecord 对象 r 一样,都是用来描述前面启动的 Activity 组件的,只不过前者是在 AMS 中使用,而后者是在应用程序进程中使用。 + +至此,MainActivity 组件的启动过程就分析完了。MainActivity 组件作为应用程序 Activity 的根 Activity,它启动起来之后,就意味着应用程序 Activity 启动起来了。因此,我们可以将一个根 Activity 的启动过程看做一个 Android 应用程序的启动过程。 \ No newline at end of file