Android Framework Development Guide

代码分析

部分重点类分析

引用:http://blog.csdn.net/windskier

1.Application,Activity,Task的关系

每一个Application都是由Activity、Service、content Provider和Broadcast Receiver等Android的基本组件所组成,其中Activity是实现应用程序的主体,它承担了大量的显示和交互工作,甚至可以理解为一个界面就是一个Activity。

Activity承担了大量的显示和交互工作,从某种角度上将,我们看见的应用程序就是许多个Activity的组合。为了让这许多Activity协同工作而不至于产生混乱,Android平台设计了一种堆栈机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity,这也是符合逻辑的。在操作应用程序时,每次启动新的Activity,都会将此压入ActivityStack,当用户执行返回操作时,移除Activity Stack顶上的Activity,这样就实现了返回上一个Activty的功能。直到用户一直返回到Home Screen,这时候可以理解为移除了ActivityStack所有的Activity,这个Activity Stack不再存在,应用程序也结束了运行。

Task是指将相关的Activity组合到一起,以Activity Stack的方式进行管理。从用户体验上讲,一个“应用程序”就是一个Task,但是从根本上讲,一个Task是可以有一个或多个Android Application组成的。例如:你想在发送短信时,拍一张照并作为彩信发出去,这时你首先停留在短信应用程序的的Acitivity上,然后跳转到Camera应用程序的Activity上,当完成拍照功能后,再返回到短信应用程序的Activity。这实际上是两个Android Application协同合作后完成的工作,但为了更好的用户体验,Android平台加入了Task这么一种机制,让用户没有感觉到应用的中断,让用户感觉在一“应用程序”里就完成了想完成的工作。

ATS

2.ActivityStack和ActivityStackSupervisor

ActivityStackSupervisor是在Android4.4后引入的

ActivityStack AMS中对ActivityStack划分为两类,其中一类是FrontStack,另一类是HomeStack。HomeStack跟其他所有ActivityStack是完全相反的

  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;
        }
    }

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

ActivityStackSupervisor是一个管理ActivityStack类,里面的函数应该可以给出上面的答案。相关函数主要有adjustStackFocus()、getFocusedStack()、setFocusedStack()等。下面看下这个几个函数。

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”区别很大,如果不加区分地进行统一设计,那么可能代码更加复杂。

I.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,
                            "adjustStackFocus: Setting focused stack=" + stack);
                    mFocusedStack = stack;
                    return mFocusedStack;
                }
            }

            // Time to create the first app stack for this user.
            int stackId =
                    mService.createStack(-1, HOME_STACK_ID, StackBox.TASK_STACK_GOES_OVER, 1.0f);
            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
                    " stackId=" + stackId);
            mFocusedStack = getStack(stackId);
            return mFocusedStack;
        }
        return mHomeStack;
    }

adjustStackFocus()函数在startActivityUncheckedLocked()中调用,也就是说当起来一个Activity时,adjustStackFocus()函数修正Activity导致对mFocusedStack的影响。adjustStackFocus(r)函数的功能是根据参数r来调整mFocusedStack值,调整完mFocusedStack值,然后紧接着调用moveHomeStack()来修正mHomeStack的状态。具体调整规则是:

①如果启动的Activity是HOME_ACTIVITY_TYPE和RECENTS_ACTIVITY_TYPE类型,那么直接返回mHomeStack,然后利用moveHomeStack()将mHomeStack设为前台Stack。

②如果启动的Activity是APPLICATION_ACTIVITY_TYPE类型,那么又细分三种情况:A、如果不存在“普通ActivityStack”,那么直接调用AMS.createStack()创建一个“普通ActivityStack”;B、如果存在“普通ActivityStack”,那么直接返回mFocusedStack;C、如果r指定了某个“普通ActivityStack”,那么返回指定的ActivityStack,并把mFocusedStack设为指定的ActivityStack;

II.setFocusedStack()

setFocusedStack()函数就是设置mStackState 的状态值来间接影响getFocusedStack()的返回值。

    void setFocusedStack(ActivityRecord r)  {
        if (r == null) {
            return;
        }
        if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) {  //①这个条件是针对Launcher和后台Activity的,所以只要把mStackState设为STACK_STATE_HOME_TO_FRONT,对决函数getFocusedStack()返回的便是mHomeStack。

            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
                if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" +
                        stackStateToString(mStackState) + " new=" +
                        stackStateToString(STACK_STATE_HOME_TO_FRONT) +
                        " Callers=" + Debug.getCallers(3));
                mStackState = STACK_STATE_HOME_TO_FRONT;
            }
        } else {                                                                     //②非Launcher和非后台Activity,走的便是这个逻辑。

            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
                    "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task +
                    " Callers=" + Debug.getCallers(3));
            final ActivityStack taskStack = r.task.stack;
            mFocusedStack = taskStack.isHomeStack() ? null : taskStack;    //③这行代码其实只要写成mFocusedStack =taskStack便可,因为taskStack不可能为mHomeStack的,这个是在②中限制住的。将mStackState = STACK_STATE_HOME_TO_BACK,那么对决函数getFocusedStack()返回的便是mFocusedStack 。
            if (mStackState != STACK_STATE_HOME_IN_BACK) {
                if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" +
                        stackStateToString(mStackState) + " new=" +
                        stackStateToString(STACK_STATE_HOME_TO_BACK) +
                        " Callers=" + Debug.getCallers(3));
                mStackState = STACK_STATE_HOME_TO_BACK;
            }
        }
    }

3.ActivityStack管理TaskRecord

TaskRecord代表了前面所说的Task。如果新启动的Activity运行在新的Task中,那么就需要创建一个TaskRecord,在哪些情况下Activity需要运行在新的Task中呢?回答这个问题需要仔细研究startActivity()流程。下面来仔细研究下Activity启动流程。

Launcher:[startActivitySafely(Intent intent,Object tag)->]

启动Activity的函数流程

AMS