本来这次是打算写TaskRecord的相关内容,
但是提笔之后,发现这个可以涉猎的东西实在是不足以单提出来一篇博客来分析,所以临时改为如题内容。
在Activity的代表ActivityRecord Step 2中,我们知道了TaskRecord的创建时机
我们来看一下三者之间的关联关系
看着是不是很乱,但如果屡清楚各自的职责,就发现很简单了
Step 1:
来看ActivityRecord这个是Activity的代表。
而他的成员变量task则是代表当前Activity所在的栈,那么栈的信息是在TaskRecord中
Step 2:
TaskRecord中我列出来两个成员变量
1.mActivities:这个就是当前栈中所有的Activity的代表
2.stack:这个就是为了提供ActivityStack的方法
Step 3:
ActivityStack的作用是什么呢?从名字上看,感觉他是真正的栈,但世界上他是一个manager的角色,
他是负责管理协调ActivityRecord和TaskRecord的,
1.mTaskHistory:这个记录的是所有的栈.
2.mValidateAppTokens:这个的作用就要先来介绍一下TaskGroup了,看过TaskGroup之后,就会发现这个是为Window准备的,这里有点类似于监听者的设计模式,每次数据信息改变之后,都会调用validateAppTokens来通知WindowManagerService.
Step 4:
TaskGroup这个类很简洁
public class TaskGroup {
public int taskId = -1;
public ArrayList<IApplicationToken> tokens = new ArrayList<IApplicationToken>();
@Override
public String toString() {
return "id=" + taskId + " tokens=" + tokens;
}
}
1.taskId可以知道,他是与TaskRecord也就是栈一一对应的。
2.tokens则是每个栈中所有Activity对应的tokens的集合
到这里之后,就会发现很多东西梳理成章的出来了
我们如果想获取栈顶Activity
就可以通过ActivityStack先获取最上面的栈,
然后在最上面的栈中获取最上面的Acitivity
看看源码是不是这样实现的呢?
final ActivityRecord topActivity() {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
final ActivityRecord r = activities.get(activityNdx);
if (!r.finishing) {
return r;
}
}
}
return null;
}
果然如此,只是他做了一些容错处理。