TaskRecord ActivityRecord ActivityStack之间的关系

本来这次是打算写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;
    }
果然如此,只是他做了一些容错处理。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值