Activity启动流程分析三 ActivityStackSupervisor启动Activity ClientTransaction在AMS和App之间的通信

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值