Android 进阶解密阅读笔记8

关于 Activity 任务栈这块,之前通过官方文档有做过翻译理解,不过理解下来还是概念性的东西,有点抽象,书中的这节从具体的实现上来讲解这块内容,加深了我的理解。

Activity 任务栈

Activity 管理.jpg

草图中描述的是和 Activity 密切相关的几个数据结构类及管理类,他们也是构成 Activity 任务栈模型的基础。图中简单描述了各个类之间的相互关系,为的是便于有个更具体的概念,

  • ActivityRecord
    描述了 Activity 的所有信息,在数据上代表着一个 Activity。它持有自己归属的任务栈的对象引用,且一个 Activity 归属一个任务栈,并且它还知道自己归属的应用进程。 另外,在类的取名上,XX_Record,一般就代表一个 XX 实体吧,别的系统我不知道,至少 Android 里大致是这样的吧,这样也方便理解和表示。

  • ActivityState
    这是个枚举类,枚举了 Activity 该有的所有状态。每个 Activity 必定会对应一个状态,即 ActivityRecord 持有着一个 ActivityState 对象引用。

  • TaskRecord
    从类名上看,就知道它描述的是任务栈的所有信息,即代表一个任务栈。那么它应该持有一组 Activity。同时它还持有自己归属的任务栈管理的对象引用,即 ActivityStack。

  • ActivityStack
    别看类名没有 Manager,但它其实是个 Activity 集合管理类。不过它也是通过 ActivityStackSupervisor 来管理 Activity 的,也就是说 ActivityStackSupervisor 里持有多个 ActivityStack 的对象引用,并且分别代表着不同含义。例如,mHomeStack 用来存储 Launcher App 的所有 Activity。同时,它也维护这一些特殊 Activity 的集合,即持有很多 ActivityRecord 数组的引用。

Activity 栈管理

以上这些数据模型可以理解为将 Activity 任务栈模型的具体化。对 Activity 栈的管理可以方便我们操控应用,表现上就是应用页面的跳转和应用间的相互切换。

对栈的管理可以通过控制 Activity 的启动来实现,例如通过启动方式,Intent 的 Flag,taskAffinity 属性等。

  • 启动方式
    说的就是 4 种 Activity 启动方式。
    standard 默认方式,每次启动都会在栈中创建一个 Activity。
    singleTop 栈顶不重复,即如果 Activity 已经在栈顶,就不会创建,而是调用 onNewIntent 方法。不在栈顶时就会创建。
    singleTask 栈中不重复,即如果同一个栈里已经有了,就不会创建,而是将 Activity 之上的其他 Activity 全部出栈,并调用 onNewIntent 方法。不在栈里时,就会创建,如果指定的栈都不存在,就会先创建任务栈,然后将 Activity 入栈。
    singleInstance 唯一栈中,即如果 Activity 已经存在,就不会创建,而是调用 onNewIntent 方法。不存在时就会创建新的栈并将 Activity 入栈。

  • Intent 的 FLAG
    除了 管理 Activity 的 Task 一 中提到的,还有一些 FLAG 也和任务栈有关
    FLAG_ACTIVITY_NO_HISTORY
    FLAG_ACTIVITY_MULTIPLE_TASK
    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    FLAG_ACTIVITY_BROUGHT_TO_FRONT
    FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    FLAG_ACTIVITY_CLEAR_TASK

  • taskAffinity
    用来指定 Activity 希望归属的栈,默认情况下一个应用的 Activity 都归属同一个栈,但配置了 taskAffinity 的 Activity 就会归属指定的栈,当然这个属性要配合其他两个条件之一才会生效, 搭配 FLAG_ACTIVITY_NEW_TASK 或者 singleTask 使用。 搭配 allowTaskReparenting = true 使用。表示 Activity 归属的任务栈可以转移,简单理解为谁启动它就归到谁的栈里(有种谁给钱,谁就是爸爸的感觉)管理 Activity 的 Task 二

你可能感兴趣的:(Android 进阶解密阅读笔记8)