Android 11 startActivity之ActivityStarter流程
11:23 am
Monday, 4 July 2022 (HKT)
Time in Hong Kong
概述
基于Android 11分析startActivity()过程中ActivityStarter的流程。
流程
startActivity
startActivity()调用实际上由startActivityForResult()实现,通过Instructmention借助Binder向ATMS发起请求。ATMS根据请求的Intent、参数等信息借助ActivityStarterController和ActivityStarter.Factory创建对应的ActivityStarter,并调用ActivityStarter.execute()完成解析启动请求的参数并实际启动Activity。

ActivityStarter.execute
ActivityStarter通过execute()执行Activity启动的准备工作、扫尾工作,并最终返回Result。通过一系列流程完成权限检查、Intent验证/拦截,并创建ActivityRecord,通过setInitialState()、compute*等方法完成mLaunchParams的计算(主要是bounds、windowingMode)。最后将ActivityRecord加入到对应的Task中,并调用ActivityStack、RootWindowContainer相关流程。

ActivityStack.startActivityLocked
ActivityStarter.execute()调用了ActivityStack.startActivityLocked()。它主要是将ActivityRecord摆放到对应的Task,并确保Task在对应的ActivityStack中。然后通过DisplayContent准备启动动画。根据Task和ActivityRecord的性质,确定Starting Window的类型(包括Task截图Snapshot、快闪欢迎屏幕SplashScreen等)并进行显示。

RootWindowContainer.resumeFocusedStacksTopActivities
RootWindowContainer.resumeFocusedStacksTopActivities()会调用targetStack的resumeTopActivityUncheckedLocked()。然后会遍历所有DisplayArea内的所有ActivityStack,并resume他们的top activity或Home Activity。

ActivityStack.resumeTopActivityUncheckedLocked
ActivityStack.resumeTopActivityUncheckedLocked()主要相关流程如下,它主要通过resumeTopActivityInnerLocked()完成对activity的resume(对于已经start的activity)和activity的start(对于没有start的top activity)。
该方法会分为两种情况进行处理——activity已经启动,只需要回调onResume()、activity没有启动,需要先创建activity。ActivityStack通过ClientTransaction借助Binder回调到应用Activity各生命周期,对于没有start的activity,则借助ActivityStackSupervisor启动,它实际上才是真正启动activity的主要流程。

ActivityStackSupervisor.startSpecificActivity
当activity没有start时,ActivityStack会调用ActivityStackSupervisor.startSpecificActivity()启动对应的Activity。
activity启动时还有一些需要特别处理的情况——启动的activity对应的进程没有启动、对应进程已经启动两大情况。
编程上,判断对应进程是否启动的条件是对应的WindowProcessController存在且绑定了相应的IApplicationThread。
1 | final WindowProcessController wpc = |
在进程已经启动的条件下,ActivityStackSupervisor会创建Configuration,并借助ClientTransaction通过Binder回调到ActivityThread,使用ClassLoader创建activity并处理生命周期,最终完成activity的start。

总结
startActivity()主要通过ActivityStarter实现检查、计算,对ActivityRecord、Task、ActivityStack的管理,最后通过DisplayContent、WindowManagerService、RootWindowContainer等完成Starting Window、Activity的创建。过程中会涉及activity是否已经start过、进程是否已经启动等条件执行不同的业务逻辑。