11:23 am
Monday, 4 July 2022 (HKT)
Time in Hong Kong


概述

基于Android 11分析startActivity()过程中ActivityStarter的流程。

流程

startActivity

startActivity()调用实际上由startActivityForResult()实现,通过Instructmention借助Binder向ATMS发起请求。ATMS根据请求的Intent、参数等信息借助ActivityStarterControllerActivityStarter.Factory创建对应的ActivityStarter,并调用ActivityStarter.execute()完成解析启动请求的参数并实际启动Activity

Android 11 ActivityStarter创建流程

ActivityStarter.execute

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

ActivityStarter.execute流程

ActivityStack.startActivityLocked

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

ActivityStack.startActivityLocked流程

RootWindowContainer.resumeFocusedStacksTopActivities

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

RootWindowContainer.resumeFocusedStacksTopActivities流程

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的主要流程。

ActivityStack.resumeTopActivityUncheckLocked流程

ActivityStackSupervisor.startSpecificActivity

当activity没有start时,ActivityStack会调用ActivityStackSupervisor.startSpecificActivity()启动对应的Activity。

activity启动时还有一些需要特别处理的情况——启动的activity对应的进程没有启动、对应进程已经启动两大情况。

编程上,判断对应进程是否启动的条件是对应的WindowProcessController存在且绑定了相应的IApplicationThread

1
2
3
final WindowProcessController wpc =
mService.getProcessController(ar.processName, ar.info.applicationInfo.uid);
final boolean up = wpc != null && wpc.hasThread();

在进程已经启动的条件下,ActivityStackSupervisor会创建Configuration,并借助ClientTransaction通过Binder回调到ActivityThread,使用ClassLoader创建activity并处理生命周期,最终完成activity的start。

ActivityStackSupervisor.startSpercificActivity流程

总结

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