Jimmy Chen

A Programmer

(原创)ActivityRecord、TaskRecord和ActivityStack之间的关系

  很久没写博客了,是时候把写博客的习惯拾起来,今天就拿这一篇先做练练手了。

  原本想着一开始就想着分析Android应用的启动过程的,但是在这个过程中发现有很多类或者说知识点没有补齐,看着看着就感觉云里雾里的,所以就返回来看这些小的内容。这篇主要是想看下ActivityRecord、TaskRecord和ActivityStack这三个类分别代表什么以及有什么用。

  首先总体说一下这三个类:
– ActivityRecord:可以从它的类命名知道,这个记录Activity信息的类,主要记录一个Activity的所有信息。一个ActivityRecord只能对应一个Activity,但是一个Activity在系统中可以存在多份实例,所以一个Activity可以对应多个ActivityRecord记录
– TaskRecord:TaskRecord由一个或者多个ActivityRecord组成,TaskRecord就是常说的任务栈,用来记录一个task里面的调用Activity的相关信息
– ActivityStack:是用来管理TaskRecord的,一个ActivityStack会包含多个TaskRecord

  三个类的大小包含关系大致如下图:

《(原创)ActivityRecord、TaskRecord和ActivityStack之间的关系》

大概了解到这么多应该也可以了,下面是博主自己看代码的记录,没多少内容,要是看官们没时间就可以不看了:

ActivityRecord

  上面代码中有很多ActivityRecord中的变量,这些变量从注释和变量名可以判断基本都是关于Activity的启动信息的。private TaskRecord task中,成员变量task是用来记录该ActivityRecord是归属于哪个TaskRecord的。在调用startActivity的过程中,会创建ActivityRecord来记录即将要启动的Activity的信息

ActivityRecord的构造函数中主要就是对类内的一些成员变量进行初始化,这里就不进行分析了。

TaskRecord

  其他的一些类成员变量我们就省略了,直接看一些关键信息

上面简单介绍了一下成员变量,主要关注的是mActivities变量,可以看到mActivities是一个ArrayList类型,用来记录当前TaskRe管理的Activity。其次和ActivityRecord类似,这里使用一个mStack记录当前TaskRecord归属哪个ActivityStack管理。下面在看看一些简单的成员方法,看看TaskRecord是如何管理自己使用到的ActivityRecord的。

如果APP是冷启动的话,即在系统之前不存在这个task,那么在startActivity的过程中会创建相应的TaskRecord,这里只是粗略的过一下,startActivity详细的调用过程会在之后的文章再做分析

ActivityStack

老规则简单列出一些成员方法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注