ActivityStackSupervisor#realStartActivityLocked(以下源码都是基于API25)
realStartActivityLocked方法中有一段非常重要的代码1
2
3
4
5
6
7
8
9
10
11
12final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
//...
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
//...
}
- 其中app是realStartActivityLocked方法传入的参数,其类型是ProcessRecord(包含当前正在运行的特定进程的完整信息)。app.thread的类型则是IApplicationThread。
- IApplicationThread接口继承了IInterface接口,所以它是一个Binder类型的接口。该接口内部包含了大量启动、停止Activity的方法。该接口的最终实现者是ActivityThread的内部类ApplicationThread
1
2
3public final class ActivityThread {
private class ApplicationThread extends ApplicationThreadNative {...}
}
1 | public abstract class ApplicationThreadNative extends Binder |
ActivityThread.ApplicationThread#scheduleLaunchActivity
1 | // we use token to identify this activity without having to send the |
该方法的实现很简单,就是发送一个启动activity的消息交给H处理。
ActivityThread.H#handleMessage
1 | private class H extends Handler { |
H对这条消息的处理是:调用ActivityThread的handleLaunchActivity方法启动activity
ActivityThread#handleLaunchActivity
1 | private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { |
其中,performLaunchActivity方法最终完成了activity对象的创建和启动,并且通过handleResumeActivity方法来调用该activity对象的onResume这一生命周期方法。
ActivityThread#performLaunchActivity
该方法主要完成了这几件事:
1. 从ActivityClientRecord中获取待启动的activity的组件信息
2. 通过Instrumentation的newActivity方法使用类加载器创建Activity对象
1 | Activity activity = null; |
3. 通过LoadedApk的makeApplication方法来尝试创建Application对象
1 | Application app = r.packageInfo.makeApplication(false, mInstrumentation); |
LoadedApk#makeApplication
1 | public Application makeApplication(boolean forceDefaultAppClass, |
可以看出,如果之前已经创建过Application对象,就直接返回该对象,这保证了一个应用只有一个Application对象。Application对象创建完毕后,会通过Instrumentation的callApplicationOnCreate方法来调用Application的onCreate方法
4. 创建ContextImpl对象并通过Activity的attach方法来完成一项重要数据的初始化
1 | Context appContext = createBaseContextForActivity(r, activity); //最终返回的是ContextImpl对象 |
- ContextImpl是Context抽象类的具体实现,ContextImpl是通过Activity的attach方法来和Activity建立关联的。
- attach方法除了关联ContextImpl和Activity,还会完成Window的创建并建立Activity和Windwo的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。
5. 调用Activity的onCreate方法
1 | if (r.isPersistable()) { |
Activity的onCreate方法的调用,也意味着Activity已经完成了整个启动过程。
参考
- 《Android开发艺术探索》