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过、进程是否已经启动等条件执行不同的业务逻辑。