应用程序的启动,又可称为根Activity的启动。但是在讲应用程序启动之前,我们有必要对应用程序进程(AppProcess)启动有所了解,那是因为启动一个应用程序首先要保证该应用程序的进程已经被启动。AMS在启动应用程序时,会先检查应用程序进程是否存在,如果不存在就需要请求Zygote进程创建并启动应用程序进程。这里我不会贴上大段大段的代码,只是一些总结,并提供了相关源码的链接。
应用程序进程(AppProcess)启动
启动大纲
- AMS发送启动应用程序进程请求.
- Zygote接收请求并创建应用程序进程.
AMS发送启动应用程序进程请求
在这里插入图片描述AMS发送启动应用程序进程请求
在这里插入图片描述应用程序(App)启动
讲完了应用程序进程(AppProcess)启动的相关内容后,接下来我们就来看看应用程序是如何一步一步启动的。
启动大纲
-
Launcher请求AMS。
-
AMS请求ApplicationThread。
-
ActivityThread启动Activity。
启动时序图
在这里插入图片描述
Launcher请求AMS
在这里插入图片描述AMS请求ApplicationThread
在这里插入图片描述-
在AMS的
startActivity
方法中,又调用了其本身的startActivityAsUser
方法,进行权限的检查。
ActivityThread启动Activity
在这里插入图片描述-
在ActivityThread调用了它的
handleLaunchActivity
方法中,会先调用其performLaunchActivity
方法,之后调用handleResumeActivity
,将Activity的状态置为Resume。
- 首先,执行了
createBaseContextForActivity
方法,创建要启动Activity的上下文; - 其次,调用执行了Instrumentation的
newActivity
方法来创建Activity实例; - 接着,调用的
makeApplication
方法,创建应用程序的Application; - 之后,调用需要启动的Activity的
attach
方法初始化Activity,创建Window对象并与Activity自身进行关联。 - 最后,调用执行了的
callActivityOnCreate
方法来启动Activity。
- 在Instrumentation执行了
callActivityOnCreate
方法中,会调用的performCreate
方法,最终会调用Activity的onCreate
方法,这样应用程序也就启动了。
应用程序启动的进程关系图
应用程序启动的过程中,主要涉及了Launcher进程、SystemServer进程、Zygote进程和应用程序进程这四个进程,它们之间的关系如下。
在这里插入图片描述