1. Activity 启动流程概述
Activity 的
startActivity()
方法有好几种重载方式,它们最终都会调用startActivityForResult()
方法在
startActivityForResult()
方法的实现中,mParent
代表的是 ActivityGroup,ActivityGroup 最开始被用来在一个界面中嵌入多个子 Activity,但是其在 API 13 中已经被废弃了,系统推荐采用 Fragment 来代替 ActivityGroupApplicationThread 是 ActivityThread 的一个内部类。从 Instrumentation 的
execStartActivity()
方法源码可知,启动 Activity 的真正的实现由ActivityManagerNative.getDefault()
的startActivity()
方法来完成。ActivityManagerService(简称 AMS)继承自 ActivityManagerNative,而 ActivityManagerNative 继承自 Binder 并实现了 IActivityManager 这个 Binder 接口,因此 AMS 是一个 Binder,它是 IActivityManager 的具体实现。在 ActivityManagerNative 中,AMS 这个 Binder 对象采用单例模式对外提供
然后会调用到 AMS 的
startActivity()
方法,然后是 ActivityStackSupervisor 的startActivity()
方法,然后是 ActivityStack 的resumeTopActivityLocked()
方法ApplicationThread 继承了 ApplicationThreadNative,而 ApplicationThreadNative 则继承了 Binder 并实现了 IApplicationThread 接口。由于 ApplicationThreadNative 被系统定义为抽象类,所以 ApplicationThread 就成了 IApplicationThread 最终的实现者
通过一系列调用,Activity 的启动过程由 ApplicationThread 的
scheduleLaunchActivity()
方法完成。在 ApplicationThread 中,scheduleLaunchActivity()
的实现很简单,就是发送一个启动 Activity 的消息交由 Handler 处理然后 Activity 的启动过程由 ActivityThread 的
handleLaunchActivity()
方法来实现,最终performLaunchActivity()
方法完成了 Activity 对象的创建和启动过程。并且 ActivityThread 通过handleResumeActivity()
方法来调用被启动 Activity 的onResume()
这一生命周期方法
2. performLaunchActivity() 方法主要的逻辑
- 从 ActivityClientRecord 中获取待启动的 Activity 的组件信息
- 通过 Instrumentation 的
newActivity()
方法使用类加载器创建 Activity 对象 - 通过 LoadApk 的
makeApplication()
方法来尝试创建 Application 对象 - 创建 ContextImpl 对象并通过 Activity 的
attach()
方法来完成一些重要数据的初始化 - 调用 Activity 的
onCreate()
方法