Activity管理笔记

本文探讨了Android系统中Activity管理的重要组件Activity Manager Service (AMS)。重点在于AMS如何通过ActivityStack和TaskRecord管理Activity,分析了ActivityStack的分类,特别是FrontStack的概念,以及AMS如何在不同场景下调整ActivityStack。此外,文章提出了关于ActivityStackSupervisor、ActivityStack和TaskRecord管理的问题,并对启动Activity的流程进行了初步研究。
摘要由CSDN通过智能技术生成

文章仅记录自己学习该模块时的一点理解,看到哪写到哪,所以特别散。


AMS管理四大组件外加进程管理,其中最庞大的算是Activity了吧。

1、AMS中对ActivityStack划分为两类,其中一类是FrontStack,另一类刚好相反。

  boolean isFrontStack(ActivityStack stack) {
        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
    }


   ActivityStack getFocusedStack() {
        if (mFocusedStack == null) {
            return mHomeStack;
        }
        switch (mStackState) {
            case STACK_STATE_HOME_IN_FRONT:
            case STACK_STATE_HOME_TO_FRONT:
                return mHomeStack;
            case STACK_STATE_HOME_IN_BACK:
            case STACK_STATE_HOME_TO_BACK:
            default:
                return mFocusedStack;
        }
    }

从上面的代码可以得出以下结论:

A )、对于4.4目前只有两个ActivityStack的逻辑很清晰:HomeStack、AStack

a、如果getFocusedStack()==HomeStack,那么HomeStack就是FrontStack,另一个就是非FrontStack。

b、如果getFocusedStack()==    AStack,那么HomeStack就是非FrontStack,另一个就是FrontStack。 

B )、如果做成**至少有三个ActivityStack:HomeStack、AStack、BStack

a、如果getFocusedStack()==HomeStack,那么HomeStack就是FrontStack,AStack、BStack就是非FrontStack。

b、如果getFocusedStack()==       AStack,那么HomeStack就是非FrontStack,AStack、BStack就是FrontStack。

c、如果getFocusedStack()==       BStack,那么HomeStack就是非FrontStack,AStack、BStack就是FrontStack。

按照现有的逻辑来说,HomeStack跟其他所有ActivityStack是完全相反的,其他所有ActivityStack要么都是FrontStack,要么都是非FrontStack。那它这个isFrontStack分类有啥用?出于什么目的而设计的?

2、AMS中对Activity的管理是通过任务栈的形式来管理的,也就是利用TaskRecord代表Task,系统中有很多Task,所以就出现了Task栈——ActivityStack,按理说只要一个ActivityStack就OK了,但是Android4.4有两个ActivityStack,并且还可以有多个,这个确实是为**设计的。

问题一:ActivityStackSupervisor是如何管理ActivityStack的呢?

问题二:ActivityStack是如何管理TaskRecord的呢?

问题三:TaskRecord如何管理ActivityRecord的呢?

这三个问题下面一一来研究。

问题一:ActivityStackSupervisor是如何管理ActivityStack的呢?

ActivityStackSupervisor是一个管理ActivityStack类,里面的函数应该可以给出上面的答案。相关函数主要有adjustStackFocus()、getFocusedStack()、setFocusedStack()等,这几个函数比较有意思,下面来研究下。但是首先必须要搞清楚mFocusedStack是个什么东西,不然代码没法看。google源码是这样解释的这个变量的:

  /** The non-home stack currently receiving input or launching the next activity. If home is
     * in front then mHomeStack overrides mFocusedStack.
     * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
上面的解释说了跟没说一样。其实这个变量应该这么理解:google把ActivityStack分为两类,一类是包含Launcher和后台界面ActivityRecord的mHomeStack,另一类是包含普通应用ActivityRecord的“普通ActivityStack”,mFocusedStack就是所有“普通ActivityStack”中的“焦点ActivityStack”,所谓“焦点ActivityStack”就是接受输入事件和启动下一个Activity,只要存在“普通ActivityStack”,那么mFocusedStack就不为null。但是“终极焦点ActivityStack”是在mHomeStack和所有“普通ActivityStack”中的“焦点ActivityStack”——mFocusedStack”中进行对决产生的,对决函数就是getFocusedStack(),对决策略就是判断mStackState状态值来选择mHomeStack或是mFocusedStack。注意,如果系统中没有启动过普通应用Activity,或是普通应用Activity都被移除了(“普通ActivityStack”中的Task被全部移除掉时会自动销毁掉这个“普通ActivityStack”,所以就会出现不存在“普通ActivityStack”),那么就不存在“普通ActivityStack”,也就是mFocusedStack为null,此时etFocusedStack()自然直接返回mHomeStack。可能是Launcher是个比较特殊的Activity,mHomeStack跟跟“普通ActivityStack”区别很大,如果不加区分地进行统一设计,那么可能代码更加复杂。理解了mFocusedStack,再来研究上面几个函数,so easy!!!

Ⅰ、先看adjustStackFocus()

   ActivityStack adjustStackFocus(ActivityRecord r)  {
        final TaskRecord task = r.task;
        if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
            if (task != null) {
                final ActivityStack taskStack = task.stack;
                if (mFocusedStack != taskStack) {
                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                            "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task);
                    mFocusedStack = taskStack.isHomeStack() ? null : taskStack;
                } else {
                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                        "adjustStackFocus: Focused stack already=" + mFocusedStack);
                }
                return taskStack;
            }

            if (mFocusedStack != null) {
                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
                return mFocusedStack;
            }

            for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
                ActivityStack stack = mStacks.get(stackNdx);
                if (!stack.isHomeStack()) {
                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值