应用程序的启动,又可称为根Activity的启动。
-
Launcher请求AMS。
-
AMS请求ApplicationThread。
-
ActivityThread启动Activity。
-
当我们点击应用程序的图标时,就会自动调用Launcher的
startActivitySafely
方法, 最终会调用Activity的startActivity
方法。 -
在Activity的
startActivity
中又调用了startActivityForResult
方法,而startActivityForResult
方法内部又调用了Instrumentation的execStartActivity
方法。 -
在Instrumentation的
execStartActivity
方法中又通过ActivityManager的getService
方法获取了IBinder类型的AMS引用IActivityManager
,最后调用了AMS的startActivity
方法。
-
在AMS的
startActivity
方法中,又调用了其本身的startActivityAsUser
方法,进行权限的检查。 -
权限检查完后,调用ActivityStarter的
startActivityMayWait
方法,并在该方法中解析处理应用程序需要的参数,并进行相关参数的初始化,最终会调用其startActivity
方法。而在startActivity
方法中又调用了startActivityUnchecked
方法来处理与栈管理相关的逻辑。 -
在处理完栈的关系后,紧接着会调用ActivityStackSupervisor的
resumeFocusedStackTopActivityLocked
方法获取需要启动的Activity所在栈的栈顶。 -
当需要启动的Activity的状态不是RESUMED状态,就需要调用ActivityStack的
resumeTopActivityUncheckedLocked
方法,而它的内部又调用了resumeTopActivityInnerLocked
方法进行一系列的栈状态的判断,最终又回调了ActivityStackSupervisor的startSpecificActivityLocked
方法。 -
在ActivityStackSupervisor的
startSpecificActivityLocked
方法中先是获取了即将启动的Activity所在的应用程序进程(就是在这个地方判断应用所在进程是否存在且已启动,如果没有启动,就需要启动应用程序进程),然后调用realStartActivityLocked
方法。 -
在ActivityStackSupervisor的
realStartActivityLocked
方法中,对启动的应用程序进程进行一系列的判断和处理,最终会调用IBinder类型的ApplicationThread引用IApplicationThread
,通过传入IApplicationThread
建立ClientTransaction
,加入执行LaunchActivityItem
任务,最终实现跨进程执行调用ActivityThread的handleLaunchActivity
方法。
-
在ActivityThread调用了它的
handleLaunchActivity
方法中,会先调用其performLaunchActivity
方法,之后调用handleResumeActivity
,将Activity的状态置为Resume。 -
在ActivityThread的performLaunchActivity方法中做了很多事情。
- 首先,执行了
createBaseContextForActivity
方法,创建要启动Activity的上下文; - 其次,调用执行了Instrumentation的
newActivity
方法来创建Activity实例; - 接着,调用LoadedApk的
makeApplication
方法,创建应用程序的Application; - 之后,调用需要启动的Activity的
attach
方法初始化Activity,创建Window对象并与Activity自身进行关联。 - 最后,调用执行了Instrumentation的
callActivityOnCreate
方法来启动Activity。
- 在Instrumentation执行了
callActivityOnCreate
方法中,会调用Activity的performCreate
方法,最终会调用Activity的onCreate
方法,这样应用程序也就启动了。
应用程序启动的过程中,主要涉及了Launcher进程、SystemServer进程、Zygote进程和应用程序进程这四个进程,它们之间的关系如下。