我们知道,activity 在 AMS 中的形式是 ActivityRecord,task 在 AMS 中的形式为TaskRecord,进程在 AMS 中的管理形式为 ProcessRecord。
我们先看下 4.4 之前的版本:
android4.4 之前的版本,AMS 管理 Task 是通过一个 ArrayList mHistory 来管理所有的 activity:
结论如下:
(1)所有的 ActivityRecord 会被存储在 mHistory 管理;
(2) 每个 ActivityRecord 会对应到一个 TaskRecord,并且有着相同 TaskRecord 的
ActivityRecord 在 mHistory 中会处在连续的位置;
(3)同一个 TaskRecord 的 Activity 可能分别处于不同的进程中,每个 Activity 所
处的进程跟 task 没有关系;
(4)TaskRecord 和 ProcessRecord 没有联系。
4.4 版本的管理方式发生了变化:
4.4
4.2
可以发现,4.4 新增了一个 ActivityStackSupervisor 类来辅助管理 TaskStack,查看源码可知:
/** The stack containing the launcher app */ private ActivityStack mHomeStack; /** 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() */ private ActivityStack mFocusedStack; /** All the non-launcher stacks */ private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); private static final int STACK_STATE_HOME_IN_FRONT = 0; private static final int STACK_STATE_HOME_TO_BACK = 1; private static final int STACK_STATE_HOME_IN_BACK = 2; private static final int STACK_STATE_HOME_TO_FRONT = 3; private int mStackState = STACK_STATE_HOME_IN_FRONT;
结论如下:
(1)管理层次的最上面是一个 ActivityStack 类型的数组 mStacks,用于管理所有的 ActivityStack。
(2)系统中只有两个 ActivityStack,一个是 mHomeStack,用于保存 Launcher 的Activity,另一个是 mFocusedStack,用于保存非 Launcher 的 App 的 Activity。
ps:调查发现,长按 home 出现的任务管理界面 Recent 也会保存在 mHomeStack。
(3)mStacks 数组中,只有上述的两个栈,但不知道为什么要用一个 List 来管理这两个元素。
(4)在每个 ActivityStack 中,都可以拥有多个 TaskRecord。这些 TaskRecord 存储在 ActivityStack.java:ArrayList<TaskRecord> mTaskHistory 之中。
(5)在 TaskRecord 中,包含 ArrayList<ActivityRecord> mActivities,用于存放该Task 中的所有的 Activity 的信息;包含 ActivityStack stack,用于记录所属的栈;包含 int
numActivities,用于记录当前 Task 中的 Activity 数量。
(6)综合上面的分析可知,要想找到某个 Activity,需要按层次查找:先找到对应的栈,再找到栈中的 Task,再在该 Task 中查找 Activity。
需要注意的是:
void removeTask(TaskRecord task) { mWindowManager.removeTask(task.taskId); final ActivityStack stack = task.stack; final ActivityRecord r = stack.mResumedActivity; if (r != null && r.task == task) { stack.mResumedActivity = null; } if (stack.removeTask(task) && !stack.isHomeStack()) { if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack); mStacks.remove(stack); final int stackId = stack.mStackId; final int nextStackId = mWindowManager.removeStack(stackId); // TODO: Perhaps we need to let the ActivityManager determine the next focus... if (mFocusedStack == null || mFocusedStack.mStackId == stackId) { // If this is the last app stack, set mFocusedStack to null. mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId); } } } ActivityStack getLastStack() { switch (mStackState) { case STACK_STATE_HOME_IN_FRONT: case STACK_STATE_HOME_TO_BACK: return mHomeStack; case STACK_STATE_HOME_TO_FRONT: case STACK_STATE_HOME_IN_BACK: default: return mFocusedStack; } }
Android 4.4的栈结构变化,布布扣,bubuko.com
原文地址:http://blog.csdn.net/eclipsexys/article/details/38487455