Activity(二)--任务栈TaskStack

413 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

一、任务栈

启动一个应用程序,系统就会创建一个task来存放Activity。默认情况下,一个Activity启动另一个Activity的时候,新的Activity会被放到栈顶,成为焦点,前一个Activity仍会保留在堆栈中,但是处于停止状态,当用户按下back键的时候,后面的Activity就会被弹出,前面的Activity就会显示出来。堆栈中的Activity仅仅会执行入栈和出栈操作。

使用任务栈的话记录用户开启了哪些Activity,这些Activity的先后顺序。

需要注意的是一个Task中的Activity可以来自不同的App,同一个App的Activity可能在不同的Task中

二、Task中的Activity的启动方法

1.AndroidManifest

  • standard

    每次点击都会创建新的Activity覆盖在原来的Activity上

  • singleTop

    启动一个Activity时,会判断当前栈顶是否为这个Activity,如果是则直接复用;如果不是则会新建

  • singleTask

    启动一个Activity时,会判断整个栈中是否有这个Activity,如果有则销毁该Activity上的所有的Activity,把自己置于栈顶;如果没有,会新建一个Activity放在栈顶

  • singleInstance

    启动一个Activity时,会新建一个任务栈,而且只保存这一个Activity

2.通过Intent的Flag

  • Intent.FLAG_ACTIVITY_NEW_TASK

    用新的Task来启动一个Activity,而且启动的每个Activity都将在一个新的Task

  • FLAG_ACTIVITY_SINGLE_TOP

    类似于singletop模式

  • FLAG_ACTIVITY_CLEAR_TOP

    类似于singleTask模式

  • FLAG_ACTIVITY_NO_HISTORY

    该模式下启动的Activity再启动其他Activity后,zheg Activity就消失了,不会在栈中保留

三、taskAffinity

每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根Activity的taskAffinity的值

使用场景

  • 当前的taskAffinity与启动的taskAffinity相同

    启动在同一个任务栈中。这也是默认的情况。

  • 当前的taskAffinity与启动的taskAffinity不同。

    如果有FLAG_ACTIVITY_NEW_TASK的flag,那么会在新的任务栈中启动activity;如果没有设置这个flag,只要是启动模式中singleTask和singleInstance,那么也会在新的任务栈中启动activity

  • 启动的taskAffinity为空。

    为空代表无论当前的activity是哪个任务栈,启动的activity都默认与其任务栈不相同。如果是带有FLAG_ACTIVITY_NEW_TASK的flag,或者启动模式为singleTask或singleInstance,那么肯定会启动一个新的任务栈