文章仅记录自己学习该模块时的一点理解,看到哪写到哪,所以特别散。
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,