「这是我参与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,那么肯定会启动一个新的任务栈