ActivityStackSupervisor启动Activity
在之前的分析里面,ActivityStarter在计算完源activty栈,目标activty栈和启动模式后,把后续的启动流程交给RootWindowContainer了。在resumeFocusedStacksTopActivities方法里面继续启动流程。resumeFocusedStacksTopActivities这个方法我自己的理解是恢复当前正在聚焦的stack顶部的activity,也就是把我们的activity压到栈顶。
// RootWindowContainer是窗口容器(WindowContainer)的根容器,管理了所有窗口容器,
// 设备上所有的窗口(Window)、显示(Display)都是由它来管理的。
// resumeFocusedStacksTopActivities会恢复对应任务栈顶部的Activity。这个方法会检查一些可见性相关的属性
// 如果当前需要resume的activityStack 是可见的,这个时候才resume. 而可见性是由RootWindowContainer中的窗口控制的。
boolean resumeFocusedStacksTopActivities(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
......
result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
......
}
ActivityStack执行ActivtyA的onPase方法,再把启动流程交给ActivityStackSupervisor
在之前解析参数的步骤中已经创建好了ActivityRecord,接下来就是栈去管理和启动ActivityRecord的过程了。由RootWindowContainer调用到ActivityStack的resumeTopActivityInnerLocked方法,这个方法基于栈里面的各种情况去管理启动流程
@GuardedBy("mService")
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
......
//要启动的Activity
ActivityRecord next = topRunningActivity(true /* focusableOnly */);
......
// 停止当前的Activity
if (mResumedActivity != null) {
if (DEBUG_STATES) Slog.d(TAG_STATES,
"resumeTopActivityLocked: Pausing " + mResumedActivity);
pausing |= startPausingLocked(userLeaving, false /* uiSleeping */, next);// 停止当前的Activity
}
//next 就是要启动的这个ActivityRecord,它是一个全新的ActivityRecord,所以这个地方返回值是 false
//我们到目前为止只是创建了一个ActivityRecord,还没有和进程关联起来
if (next.attachedToProcess()) {
//为false
......
}else{
......
//启动指定的Activity
mStackSupervisor.startSpecificActivity(next, true, true);
}
}
在这个函数里面根据栈里面的各种情况去管理启动流程,然后执行源Activity的onPase方法,把onPase包装成一个事务,让源Activity处于可见但不可交互状态;接下来就会走到ActivityStackSupervisor里面的startSpecificActivity方法
ActivityStackSupervisor把要启动的Activity的起始生命周期和结束生命周期封装在ClientTranstion事务中
ActivityStackSupervisor用于管理ActivityStack,ActivityStackSupervisor会将Activity生命周期封装成一个ClientTranstion事务
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean