区块链技术博客
www.b2bchain.cn

Android 复习笔记 —— 任务栈和返回栈求职学习资料

本文介绍了Android 复习笔记 —— 任务栈和返回栈求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

距离上一篇博客,大概已经过去一个月了。

总结一下最近两周,大概就是睡一觉起来突然想换工作,然后被各路面试官吊打 ~

除了自身能力原因之外,准备不足的确也是很大的问题。所以我想把面试准备当做长期工作,把自己长期保持在一个 随时可以面试 的状态。

所以,这里是一个全新的专栏 —— Android 复习笔记 。记录我的 Android 复习之路,也希望可以帮助到你。

和 重学 Kotlin 一样,文章会在小专栏永久更新。传送门:

https://xiaozhuanlan.com/android

今天就来唠唠 任务栈返回栈

任务栈?返回栈?

关于 任务栈和返回栈,我看了 N 篇博客,说的最清楚的除了 重学安卓 ,那就非 官方文档 莫属了。其实大多时候,很多模糊不清的基本概念,从官方文档都可以轻松的得到你想要的答案。

官方文档中这一节的标题叫做 Understand Tasks and Back Stack ,Task 就是我们常说的 任务栈Back Stack 就是返回栈

任务栈很好理解,Activity 们是存在一个栈结构中的,后进先出,这也很符合实际的使用场景。

Android 复习笔记 —— 任务栈和返回栈

依次打开 Activity1Activity2Activity3,它们依次入栈,如上图所示。然后连续按下两次返回键,Activity3Activity2 会依次出栈。

那么,返回栈呢?

什么是返回栈?

返回栈的作用是什么?

返回栈和任务栈的区别是什么?

灵魂三连拷问,不知道你能不能清晰的给出答案。这里暂且按住不表,我们先来看看 影响任务栈和返回栈的因素 有哪些?

Android 复习笔记 —— 任务栈和返回栈

我们从 launchMode(启动模式) 开始说起。

启动模式

声明启动模式有两种方式:

  1. 在清单文件中声明待启动的 Activity 的 launchMode 属性
  2. 代码中通过 Intent 启动 Activity 时,设置 flag

如果在一次启动过程中,两种方案都设置了,后者优先级比较高。

清单文件的 launchMode 和 intent flag 都不能完全代替对方。

launchMode 属性有四种取值 : standardsingleTopsingleTasksingleInstance

standard: 标准启动模式

也是默认的启动模式,每次启动 Activity 都会新建一个新的实例。待启动 Activity 会进入源 Activity 所属任务栈。

同一个 Activity 可能被实例化多次 。

singleTop: 栈顶复用模式

待启动 Activity 已经位于源 Activity 所属的任务栈的栈顶时,不会创建新的 Activity,而是直接使用栈顶的 Activity,并回调它的 onNewIntent 方法,onCreateonStart 不会被调用,直接回调 onResume

否则的话,在栈顶创建一个新的 Activity 实例。

singleTask:栈内复用模式

全局单实例,首先会寻找要启动的 Activity 想要的任务栈(默认或者 taskAffinity 属性指定),如果没有找到,则创建新的任务栈并将 Activity 实例放入。如果找到了想要的任务栈,这时候要判断栈中是否已经存在该 Activity 的实例,如果已经存在,会将该 Activity 以上的其他 Activity 实例弹出,把自己放到栈顶,同样也是回调 onNewIntentonResume。如果实例不存在,创建新的实例并压入栈中。

singleInstance:单实例模式

全局单实例,首次启动时会创建新的 Activity 实例,并放入一个新的任务栈中,且 这个任务栈中只会有这一个实例。 后续启动不会再新建实例。

默认的 standard 模式其实已经满足大部分情况下的需求,但是 同一个 Activity 会创建多次实例 在某些情况下肯定是不合适的,返回栈也会很突兀。这时候就需要复用已经存在的 Activity 实例,所以有了 singleTopsingleTask 两种不同的复用方式。而 singleInstance 则更加直接,Activity 实例和任务栈都是全局唯一的。

另外注意一点,singleTask 的 Activity 实例也是全局唯一的。可能有的人会问,在不同的任务栈中可能会存在重复的启动模式为 singleTask 的 Activity 实例吗?其实你仔细想一下就能发现,这是做不到的。

taskAffinity

前面提到了 Activity 想要的任务栈taskAffinity 的作用就是指定想要的任务栈。但它并不会在任何场景下都会起作用。

未显式声明 taskAffinity 的 Activity 都具有默认的任务栈,该任务栈的名称是应用包名。

当启动模式设置为 standardsingleTop 时,它是不起作用的。待启动的 Activity 会跟随源 Activity 的任务栈,即使你显式声明了不一样的 taskAffinity

当启动模式设置了 singleTask 或者 singleInstance 时,它就会新建任务栈来存储待启动的 Activity 实例。

除了 singleTask 和 singleInstance 以外,FLAG_ACTIVITY_NEW_TASK 也会使 taskAffinity 生效,后面会进行介绍。

返回栈的意义

在了解了上面的基础知识之后,我们可以来试着挖掘 返回栈的存在及其意义 。

官网上给了一个很好的例子来说明返回栈的存在,我就不搬官网的图了,画的并不是多么美观。我重新做了一张图。

Android 复习笔记 —— 任务栈和返回栈

图中虚线框表示任务栈,实线框表示返回栈。

Activity 1Activity 2 处于前台任务栈,即当前获得焦点的任务栈,它们的启动模式都是 standardActivity XActivity Y 处于后台任务栈,它们的启动模式都是 singleTask。在位于前台任务栈顶的 Activity 2 中启动处于后台任务栈的 Activity Y(跨应用启动) ,此时会把整个后台任务栈带到前台,并放到 返回栈 的栈顶。此时,X 和 Y 的 taskId 是一致的,1 和 2 的 taskId 是一致的,它们仍然处于各自的任务栈中,但返回栈中自顶而下依次是,Y -> X -> 2 -> 1 。此时按下返回键,并不会回到 Activity 2,而是先回到 Activity X 。

从上图中可以清晰的看到 任务栈和返回栈是独立存在的,用户页面的返回依赖的是返回栈,而不是任务栈。一个返回栈中可能会包含来自不同任务栈的 Activity ,以维护正确的回退栈关系。这就是返回栈存在的意义。

如果 Activity X 和 Y 的启动模式都是 standard 呢 ?会直接在 Activity 2 所属的任务栈顶直接新建一个 Y 实例 ,Activity 2 的返回栈中依次是 Y -> 2 -> 1 。此时,两个应用的返回栈各不干扰。下图展示了 X 和 Y 都是 standard 的情况。

Android 复习笔记 —— 任务栈和返回栈

同样,singleTop 也不行,和 standard 表现一致。

Intent Flag

影响启动模式,任务栈和返回栈的另一种方式就是为 Intent 设置启动标记。

设置启动标记的方法有如下两个:

public @NonNull Intent setFlags(@Flags int flags) {         mFlags = flags;         return this; }  public @NonNull Intent addFlags(@Flags int flags) {         mFlags |= flags;         return this; }

一个是 设置,一个是 添加,在使用的时候要注意。

Intent flag 有很多,这里挑选比较经典的三个 flag , NEW_TASKCLEAR_TOPSINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

首先,在不设置 taskAffinity 的情况下,单独设置 FLAG_ACTIVITY_NEW_TASK 并没有任何意义,不会创建新的任务栈,每次启动都会创建新的 Activity 实例,不会 栈内复用

对了,为什么要提到 栈内复用 呢?那不是 singleTask 的特性吗?

网上很多关于 Activity 启动模式的文章,都会这么说:

官方文档上说,FLAG_ACTIVITY_NEW_TASK 和 singleTask 的行为一致。其实这是不正确的。

正如我前面所说的,单看这句话,它们的行为的确不一致。那么,官方文档真的在传递错误的认知吗?

先来看看这些网文的论据,也就是官方文档上的原话:

Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent().
This produces the same behavior as the "singleTask" launchMode value, discussed in the previous section.

细品,它表达的其实是,在一个新的任务栈中启动 Activity 。如果想要的任务栈已经存在,并且其中已经运行着待启动的 Activity ,那么这个任务栈会被带到前台,并回调 onNewIntent() 。这个行为和 singleTask 一致。

还拿 返回栈的意义 一节中的例子做实验, Activity X 和 Y 的启动模式都设置为 standard,搭配 FLAT_ACTIVITY_NEW_TASK 启动,不设置 taskAffinity ,其实也能达到和 singleTask 基本一样的返回栈效果。

但并不是完全相同,这样产生的返回栈是 Y -> Y -> X -> 2 -> 1 。对照下面的任务栈和返回栈捋一捋。

Android 复习笔记 —— 任务栈和返回栈

距离上一篇博客,大概已经过去一个月了。

总结一下最近两周,大概就是睡一觉起来突然想换工作,然后被各路面试官吊打 ~

除了自身能力原因之外,准备不足的确也是很大的问题。所以我想把面试准备当做长期工作,把自己长期保持在一个 随时可以面试 的状态。

所以,这里是一个全新的专栏 —— Android 复习笔记 。记录我的 Android 复习之路,也希望可以帮助到你。

和 重学 Kotlin 一样,文章会在小专栏永久更新。传送门:

https://xiaozhuanlan.com/android

今天就来唠唠 任务栈返回栈

任务栈?返回栈?

关于 任务栈和返回栈,我看了 N 篇博客,说的最清楚的除了 重学安卓 ,那就非 官方文档 莫属了。其实大多时候,很多模糊不清的基本概念,从官方文档都可以轻松的得到你想要的答案。

官方文档中这一节的标题叫做 Understand Tasks and Back Stack ,Task 就是我们常说的 任务栈Back Stack 就是返回栈

任务栈很好理解,Activity 们是存在一个栈结构中的,后进先出,这也很符合实际的使用场景。

Android 复习笔记 —— 任务栈和返回栈

依次打开 Activity1Activity2Activity3,它们依次入栈,如上图所示。然后连续按下两次返回键,Activity3Activity2 会依次出栈。

那么,返回栈呢?

什么是返回栈?

返回栈的作用是什么?

返回栈和任务栈的区别是什么?

灵魂三连拷问,不知道你能不能清晰的给出答案。这里暂且按住不表,我们先来看看 影响任务栈和返回栈的因素 有哪些?

Android 复习笔记 —— 任务栈和返回栈

我们从 launchMode(启动模式) 开始说起。

启动模式

声明启动模式有两种方式:

  1. 在清单文件中声明待启动的 Activity 的 launchMode 属性
  2. 代码中通过 Intent 启动 Activity 时,设置 flag

如果在一次启动过程中,两种方案都设置了,后者优先级比较高。

清单文件的 launchMode 和 intent flag 都不能完全代替对方。

launchMode 属性有四种取值 : standardsingleTopsingleTasksingleInstance

standard: 标准启动模式

也是默认的启动模式,每次启动 Activity 都会新建一个新的实例。待启动 Activity 会进入源 Activity 所属任务栈。

同一个 Activity 可能被实例化多次 。

singleTop: 栈顶复用模式

待启动 Activity 已经位于源 Activity 所属的任务栈的栈顶时,不会创建新的 Activity,而是直接使用栈顶的 Activity,并回调它的 onNewIntent 方法,onCreateonStart 不会被调用,直接回调 onResume

否则的话,在栈顶创建一个新的 Activity 实例。

singleTask:栈内复用模式

全局单实例,首先会寻找要启动的 Activity 想要的任务栈(默认或者 taskAffinity 属性指定),如果没有找到,则创建新的任务栈并将 Activity 实例放入。如果找到了想要的任务栈,这时候要判断栈中是否已经存在该 Activity 的实例,如果已经存在,会将该 Activity 以上的其他 Activity 实例弹出,把自己放到栈顶,同样也是回调 onNewIntentonResume。如果实例不存在,创建新的实例并压入栈中。

singleInstance:单实例模式

全局单实例,首次启动时会创建新的 Activity 实例,并放入一个新的任务栈中,且 这个任务栈中只会有这一个实例。 后续启动不会再新建实例。

默认的 standard 模式其实已经满足大部分情况下的需求,但是 同一个 Activity 会创建多次实例 在某些情况下肯定是不合适的,返回栈也会很突兀。这时候就需要复用已经存在的 Activity 实例,所以有了 singleTopsingleTask 两种不同的复用方式。而 singleInstance 则更加直接,Activity 实例和任务栈都是全局唯一的。

另外注意一点,singleTask 的 Activity 实例也是全局唯一的。可能有的人会问,在不同的任务栈中可能会存在重复的启动模式为 singleTask 的 Activity 实例吗?其实你仔细想一下就能发现,这是做不到的。

taskAffinity

前面提到了 Activity 想要的任务栈taskAffinity 的作用就是指定想要的任务栈。但它并不会在任何场景下都会起作用。

未显式声明 taskAffinity 的 Activity 都具有默认的任务栈,该任务栈的名称是应用包名。

当启动模式设置为 standardsingleTop 时,它是不起作用的。待启动的 Activity 会跟随源 Activity 的任务栈,即使你显式声明了不一样的 taskAffinity

当启动模式设置了 singleTask 或者 singleInstance 时,它就会新建任务栈来存储待启动的 Activity 实例。

除了 singleTask 和 singleInstance 以外,FLAG_ACTIVITY_NEW_TASK 也会使 taskAffinity 生效,后面会进行介绍。

返回栈的意义

在了解了上面的基础知识之后,我们可以来试着挖掘 返回栈的存在及其意义 。

官网上给了一个很好的例子来说明返回栈的存在,我就不搬官网的图了,画的并不是多么美观。我重新做了一张图。

Android 复习笔记 —— 任务栈和返回栈

图中虚线框表示任务栈,实线框表示返回栈。

Activity 1Activity 2 处于前台任务栈,即当前获得焦点的任务栈,它们的启动模式都是 standardActivity XActivity Y 处于后台任务栈,它们的启动模式都是 singleTask。在位于前台任务栈顶的 Activity 2 中启动处于后台任务栈的 Activity Y(跨应用启动) ,此时会把整个后台任务栈带到前台,并放到 返回栈 的栈顶。此时,X 和 Y 的 taskId 是一致的,1 和 2 的 taskId 是一致的,它们仍然处于各自的任务栈中,但返回栈中自顶而下依次是,Y -> X -> 2 -> 1 。此时按下返回键,并不会回到 Activity 2,而是先回到 Activity X 。

从上图中可以清晰的看到 任务栈和返回栈是独立存在的,用户页面的返回依赖的是返回栈,而不是任务栈。一个返回栈中可能会包含来自不同任务栈的 Activity ,以维护正确的回退栈关系。这就是返回栈存在的意义。

如果 Activity X 和 Y 的启动模式都是 standard 呢 ?会直接在 Activity 2 所属的任务栈顶直接新建一个 Y 实例 ,Activity 2 的返回栈中依次是 Y -> 2 -> 1 。此时,两个应用的返回栈各不干扰。下图展示了 X 和 Y 都是 standard 的情况。

Android 复习笔记 —— 任务栈和返回栈

同样,singleTop 也不行,和 standard 表现一致。

Intent Flag

影响启动模式,任务栈和返回栈的另一种方式就是为 Intent 设置启动标记。

设置启动标记的方法有如下两个:

public @NonNull Intent setFlags(@Flags int flags) {         mFlags = flags;         return this; }  public @NonNull Intent addFlags(@Flags int flags) {         mFlags |= flags;         return this; }

一个是 设置,一个是 添加,在使用的时候要注意。

Intent flag 有很多,这里挑选比较经典的三个 flag , NEW_TASKCLEAR_TOPSINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

首先,在不设置 taskAffinity 的情况下,单独设置 FLAG_ACTIVITY_NEW_TASK 并没有任何意义,不会创建新的任务栈,每次启动都会创建新的 Activity 实例,不会 栈内复用

对了,为什么要提到 栈内复用 呢?那不是 singleTask 的特性吗?

网上很多关于 Activity 启动模式的文章,都会这么说:

官方文档上说,FLAG_ACTIVITY_NEW_TASK 和 singleTask 的行为一致。其实这是不正确的。

正如我前面所说的,单看这句话,它们的行为的确不一致。那么,官方文档真的在传递错误的认知吗?

先来看看这些网文的论据,也就是官方文档上的原话:

Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent().
This produces the same behavior as the "singleTask" launchMode value, discussed in the previous section.

细品,它表达的其实是,在一个新的任务栈中启动 Activity 。如果想要的任务栈已经存在,并且其中已经运行着待启动的 Activity ,那么这个任务栈会被带到前台,并回调 onNewIntent() 。这个行为和 singleTask 一致。

还拿 返回栈的意义 一节中的例子做实验, Activity X 和 Y 的启动模式都设置为 standard,搭配 FLAT_ACTIVITY_NEW_TASK 启动,不设置 taskAffinity ,其实也能达到和 singleTask 基本一样的返回栈效果。

但并不是完全相同,这样产生的返回栈是 Y -> Y -> X -> 2 -> 1 。对照下面的任务栈和返回栈捋一捋。

Android 复习笔记 —— 任务栈和返回栈

距离上一篇博客,大概已经过去一个月了。

总结一下最近两周,大概就是睡一觉起来突然想换工作,然后被各路面试官吊打 ~

除了自身能力原因之外,准备不足的确也是很大的问题。所以我想把面试准备当做长期工作,把自己长期保持在一个 随时可以面试 的状态。

所以,这里是一个全新的专栏 —— Android 复习笔记 。记录我的 Android 复习之路,也希望可以帮助到你。

和 重学 Kotlin 一样,文章会在小专栏永久更新。传送门:

https://xiaozhuanlan.com/android

今天就来唠唠 任务栈返回栈

任务栈?返回栈?

关于 任务栈和返回栈,我看了 N 篇博客,说的最清楚的除了 重学安卓 ,那就非 官方文档 莫属了。其实大多时候,很多模糊不清的基本概念,从官方文档都可以轻松的得到你想要的答案。

官方文档中这一节的标题叫做 Understand Tasks and Back Stack ,Task 就是我们常说的 任务栈Back Stack 就是返回栈

任务栈很好理解,Activity 们是存在一个栈结构中的,后进先出,这也很符合实际的使用场景。

Android 复习笔记 —— 任务栈和返回栈

依次打开 Activity1Activity2Activity3,它们依次入栈,如上图所示。然后连续按下两次返回键,Activity3Activity2 会依次出栈。

那么,返回栈呢?

什么是返回栈?

返回栈的作用是什么?

返回栈和任务栈的区别是什么?

灵魂三连拷问,不知道你能不能清晰的给出答案。这里暂且按住不表,我们先来看看 影响任务栈和返回栈的因素 有哪些?

Android 复习笔记 —— 任务栈和返回栈

我们从 launchMode(启动模式) 开始说起。

启动模式

声明启动模式有两种方式:

  1. 在清单文件中声明待启动的 Activity 的 launchMode 属性
  2. 代码中通过 Intent 启动 Activity 时,设置 flag

如果在一次启动过程中,两种方案都设置了,后者优先级比较高。

清单文件的 launchMode 和 intent flag 都不能完全代替对方。

launchMode 属性有四种取值 : standardsingleTopsingleTasksingleInstance

standard: 标准启动模式

也是默认的启动模式,每次启动 Activity 都会新建一个新的实例。待启动 Activity 会进入源 Activity 所属任务栈。

同一个 Activity 可能被实例化多次 。

singleTop: 栈顶复用模式

待启动 Activity 已经位于源 Activity 所属的任务栈的栈顶时,不会创建新的 Activity,而是直接使用栈顶的 Activity,并回调它的 onNewIntent 方法,onCreateonStart 不会被调用,直接回调 onResume

否则的话,在栈顶创建一个新的 Activity 实例。

singleTask:栈内复用模式

全局单实例,首先会寻找要启动的 Activity 想要的任务栈(默认或者 taskAffinity 属性指定),如果没有找到,则创建新的任务栈并将 Activity 实例放入。如果找到了想要的任务栈,这时候要判断栈中是否已经存在该 Activity 的实例,如果已经存在,会将该 Activity 以上的其他 Activity 实例弹出,把自己放到栈顶,同样也是回调 onNewIntentonResume。如果实例不存在,创建新的实例并压入栈中。

singleInstance:单实例模式

全局单实例,首次启动时会创建新的 Activity 实例,并放入一个新的任务栈中,且 这个任务栈中只会有这一个实例。 后续启动不会再新建实例。

默认的 standard 模式其实已经满足大部分情况下的需求,但是 同一个 Activity 会创建多次实例 在某些情况下肯定是不合适的,返回栈也会很突兀。这时候就需要复用已经存在的 Activity 实例,所以有了 singleTopsingleTask 两种不同的复用方式。而 singleInstance 则更加直接,Activity 实例和任务栈都是全局唯一的。

另外注意一点,singleTask 的 Activity 实例也是全局唯一的。可能有的人会问,在不同的任务栈中可能会存在重复的启动模式为 singleTask 的 Activity 实例吗?其实你仔细想一下就能发现,这是做不到的。

taskAffinity

前面提到了 Activity 想要的任务栈taskAffinity 的作用就是指定想要的任务栈。但它并不会在任何场景下都会起作用。

未显式声明 taskAffinity 的 Activity 都具有默认的任务栈,该任务栈的名称是应用包名。

当启动模式设置为 standardsingleTop 时,它是不起作用的。待启动的 Activity 会跟随源 Activity 的任务栈,即使你显式声明了不一样的 taskAffinity

当启动模式设置了 singleTask 或者 singleInstance 时,它就会新建任务栈来存储待启动的 Activity 实例。

除了 singleTask 和 singleInstance 以外,FLAG_ACTIVITY_NEW_TASK 也会使 taskAffinity 生效,后面会进行介绍。

返回栈的意义

在了解了上面的基础知识之后,我们可以来试着挖掘 返回栈的存在及其意义 。

官网上给了一个很好的例子来说明返回栈的存在,我就不搬官网的图了,画的并不是多么美观。我重新做了一张图。

Android 复习笔记 —— 任务栈和返回栈

图中虚线框表示任务栈,实线框表示返回栈。

Activity 1Activity 2 处于前台任务栈,即当前获得焦点的任务栈,它们的启动模式都是 standardActivity XActivity Y 处于后台任务栈,它们的启动模式都是 singleTask。在位于前台任务栈顶的 Activity 2 中启动处于后台任务栈的 Activity Y(跨应用启动) ,此时会把整个后台任务栈带到前台,并放到 返回栈 的栈顶。此时,X 和 Y 的 taskId 是一致的,1 和 2 的 taskId 是一致的,它们仍然处于各自的任务栈中,但返回栈中自顶而下依次是,Y -> X -> 2 -> 1 。此时按下返回键,并不会回到 Activity 2,而是先回到 Activity X 。

从上图中可以清晰的看到 任务栈和返回栈是独立存在的,用户页面的返回依赖的是返回栈,而不是任务栈。一个返回栈中可能会包含来自不同任务栈的 Activity ,以维护正确的回退栈关系。这就是返回栈存在的意义。

如果 Activity X 和 Y 的启动模式都是 standard 呢 ?会直接在 Activity 2 所属的任务栈顶直接新建一个 Y 实例 ,Activity 2 的返回栈中依次是 Y -> 2 -> 1 。此时,两个应用的返回栈各不干扰。下图展示了 X 和 Y 都是 standard 的情况。

Android 复习笔记 —— 任务栈和返回栈

同样,singleTop 也不行,和 standard 表现一致。

Intent Flag

影响启动模式,任务栈和返回栈的另一种方式就是为 Intent 设置启动标记。

设置启动标记的方法有如下两个:

public @NonNull Intent setFlags(@Flags int flags) {         mFlags = flags;         return this; }  public @NonNull Intent addFlags(@Flags int flags) {         mFlags |= flags;         return this; }

一个是 设置,一个是 添加,在使用的时候要注意。

Intent flag 有很多,这里挑选比较经典的三个 flag , NEW_TASKCLEAR_TOPSINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

首先,在不设置 taskAffinity 的情况下,单独设置 FLAG_ACTIVITY_NEW_TASK 并没有任何意义,不会创建新的任务栈,每次启动都会创建新的 Activity 实例,不会 栈内复用

对了,为什么要提到 栈内复用 呢?那不是 singleTask 的特性吗?

网上很多关于 Activity 启动模式的文章,都会这么说:

官方文档上说,FLAG_ACTIVITY_NEW_TASK 和 singleTask 的行为一致。其实这是不正确的。

正如我前面所说的,单看这句话,它们的行为的确不一致。那么,官方文档真的在传递错误的认知吗?

先来看看这些网文的论据,也就是官方文档上的原话:

Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent().
This produces the same behavior as the "singleTask" launchMode value, discussed in the previous section.

细品,它表达的其实是,在一个新的任务栈中启动 Activity 。如果想要的任务栈已经存在,并且其中已经运行着待启动的 Activity ,那么这个任务栈会被带到前台,并回调 onNewIntent() 。这个行为和 singleTask 一致。

还拿 返回栈的意义 一节中的例子做实验, Activity X 和 Y 的启动模式都设置为 standard,搭配 FLAT_ACTIVITY_NEW_TASK 启动,不设置 taskAffinity ,其实也能达到和 singleTask 基本一样的返回栈效果。

但并不是完全相同,这样产生的返回栈是 Y -> Y -> X -> 2 -> 1 。对照下面的任务栈和返回栈捋一捋。

Android 复习笔记 —— 任务栈和返回栈

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Android 复习笔记 —— 任务栈和返回栈求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们