android singleTask activity 不作为根?
android singleTask activity not as the root?
我一直在阅读有关启动模式的文档,但有一件事我不明白。 doc 表示 singleTask activity 始终是堆栈的根:
In contrast, "singleTask" and "singleInstance" activities can only
begin a task. They are always at the root of the activity stack.
Moreover, the device can hold only one instance of the activity at a
time — only one such task.
但是:如果你查看 this part of doc at Figure 4,你会发现当 Activity 2 开始时 Activity Y(将该任务置于前台),Activity Y 已经在任务的顶部,并将在当前任务的顶部,而不是根。
我在这个 simulation app 中尝试了这个场景,当我创建 singleTask activity 时,它总是会创建一个新任务。但是,如果唯一的实例已经存在,它会完成此实例之上的所有活动,因此唯一的实例可以是根(也是任务中唯一的 activity)。
Activity Y 怎么会排在 Activity X 之上的任务顶部?
我失踪还有其他原因吗?
PS: 我也不太明白Task和back stack的区别
像往常一样(叹息),文档是错误的。在您引用的图表中,显然 Activity Y 不能定义为 singleTask
,但在包含 2 个活动的后台任务中仍然是顶部 activity。
在使用特殊启动模式 singleTask
和 singleInstance
测试场景时,请注意 taskAffinity
在此行为中起着重要作用,因为 taskAffinity
优先于特殊启动模式。
关于"task"和"back stack"的区别:
一个"task"是一堆活动,可以作为一个整体来操作。
- 当您启动一个应用程序时(假设它当前不是 运行),Android 会在前台创建一个新任务并包含 activity您启动的应用程序。
- 当 activity 开始新活动时,这些新活动将添加到当前任务中(通常,尽管此行为有例外)。
- 当您按下主页按钮时,当前任务从前台移动到后台。
- 当您显示"recents"的列表时,显示的是最近任务列表,而不是最近活动列表或最近应用程序列表。
- 当您 select 最近任务列表中的任务时,如果该任务仍然处于活动状态(其中仍有实时活动),则整个任务(包括其所有活动)将从背景到前景。
- 任务也可以是"stacked"。当当前任务中的 activity 启动新任务中的 activity 时,新任务将堆叠在当前任务之上。这仅用于控制新任务完成时发生的情况。通常情况下,当新任务完成时(它的所有活动都已完成),Android 将 return 用户转到上一个任务(即:启动完成任务的任务)。
A "back stack" 通常是指任务中的一组活动。每个任务都有自己的活动堆栈。这用于控制当前 activity(返回堆栈顶部的那个)完成时发生的情况。通常Android returns 用户到activity 的正下方(下面)整理activity 在返回堆栈中。
Android 代码和文档经常引用任务的 "root"(这是用于启动任务的 activity)和 "top"或任务的 "front"(这是当前显示的 activity)。
实际上,文档存在 :-( 这是一个示例:
In contrast, "singleTask" and "singleInstance" activities can only
begin a task.
这种说法通常是正确的,但并不总是正确的。例如,假设我有 2 个活动:A
和 B
。 A
是启动 activity(即:带有 ACTION=MAIN
和 CATEGORY=DEFAULT
的启动)并且使用标准启动模式定义。 B
定义为 launchMode="singleTask"
。我启动了应用程序,Android 创建了一个 A
的实例。在 A
然后我做:
startActivity(new Intent(this, B.class));
这将创建 activity B
的新实例,并在同一任务中将其置于 A
之上。它不会创建一个以activity B
为根的新任务。原因是 activity A
和 activity B
具有相同的 taskAffinity
(默认情况下应用程序的所有 Activity 具有相同的 taskAffinity
) , 在这种情况下 Android 将忽略 B
的启动模式。
文档还说:
Moreover, the device can hold only one instance of the activity at a
time — only one such task.
同样,taskAffinity
可以打破这种行为。再次假设我们有 A
、B
和 C
,它们都具有相同的(默认)taskAffinity
。 A
和 C
具有标准启动模式,B
具有 launchMode="singleTask"
。如果 A
启动 B
,B
的实例不会在新任务中结束,而是在与 A
相同的任务中结束(见上文)。现在 B
开始 C
。 Android 创建了一个 C
的实例,并在同一任务中将其置于 B
之上。现在 C
呼叫:
startActivity(new Intent(this, B.class));
Android 创建一个 B
的新实例,并将其放在任务中 C
的顶部。现在有 2 个 B
实例,它们都不是任务的根 activity!此行为也是由于 taskAffinity
胜过启动模式。
我一直在阅读有关启动模式的文档,但有一件事我不明白。 doc 表示 singleTask activity 始终是堆栈的根:
In contrast, "singleTask" and "singleInstance" activities can only begin a task. They are always at the root of the activity stack. Moreover, the device can hold only one instance of the activity at a time — only one such task.
但是:如果你查看 this part of doc at Figure 4,你会发现当 Activity 2 开始时 Activity Y(将该任务置于前台),Activity Y 已经在任务的顶部,并将在当前任务的顶部,而不是根。
我在这个 simulation app 中尝试了这个场景,当我创建 singleTask activity 时,它总是会创建一个新任务。但是,如果唯一的实例已经存在,它会完成此实例之上的所有活动,因此唯一的实例可以是根(也是任务中唯一的 activity)。
Activity Y 怎么会排在 Activity X 之上的任务顶部?
我失踪还有其他原因吗?
PS: 我也不太明白Task和back stack的区别
像往常一样(叹息),文档是错误的。在您引用的图表中,显然 Activity Y 不能定义为 singleTask
,但在包含 2 个活动的后台任务中仍然是顶部 activity。
在使用特殊启动模式 singleTask
和 singleInstance
测试场景时,请注意 taskAffinity
在此行为中起着重要作用,因为 taskAffinity
优先于特殊启动模式。
关于"task"和"back stack"的区别:
一个"task"是一堆活动,可以作为一个整体来操作。
- 当您启动一个应用程序时(假设它当前不是 运行),Android 会在前台创建一个新任务并包含 activity您启动的应用程序。
- 当 activity 开始新活动时,这些新活动将添加到当前任务中(通常,尽管此行为有例外)。
- 当您按下主页按钮时,当前任务从前台移动到后台。
- 当您显示"recents"的列表时,显示的是最近任务列表,而不是最近活动列表或最近应用程序列表。
- 当您 select 最近任务列表中的任务时,如果该任务仍然处于活动状态(其中仍有实时活动),则整个任务(包括其所有活动)将从背景到前景。
- 任务也可以是"stacked"。当当前任务中的 activity 启动新任务中的 activity 时,新任务将堆叠在当前任务之上。这仅用于控制新任务完成时发生的情况。通常情况下,当新任务完成时(它的所有活动都已完成),Android 将 return 用户转到上一个任务(即:启动完成任务的任务)。
A "back stack" 通常是指任务中的一组活动。每个任务都有自己的活动堆栈。这用于控制当前 activity(返回堆栈顶部的那个)完成时发生的情况。通常Android returns 用户到activity 的正下方(下面)整理activity 在返回堆栈中。
Android 代码和文档经常引用任务的 "root"(这是用于启动任务的 activity)和 "top"或任务的 "front"(这是当前显示的 activity)。
实际上,文档存在 :-( 这是一个示例:
In contrast, "singleTask" and "singleInstance" activities can only begin a task.
这种说法通常是正确的,但并不总是正确的。例如,假设我有 2 个活动:A
和 B
。 A
是启动 activity(即:带有 ACTION=MAIN
和 CATEGORY=DEFAULT
的启动)并且使用标准启动模式定义。 B
定义为 launchMode="singleTask"
。我启动了应用程序,Android 创建了一个 A
的实例。在 A
然后我做:
startActivity(new Intent(this, B.class));
这将创建 activity B
的新实例,并在同一任务中将其置于 A
之上。它不会创建一个以activity B
为根的新任务。原因是 activity A
和 activity B
具有相同的 taskAffinity
(默认情况下应用程序的所有 Activity 具有相同的 taskAffinity
) , 在这种情况下 Android 将忽略 B
的启动模式。
文档还说:
Moreover, the device can hold only one instance of the activity at a time — only one such task.
同样,taskAffinity
可以打破这种行为。再次假设我们有 A
、B
和 C
,它们都具有相同的(默认)taskAffinity
。 A
和 C
具有标准启动模式,B
具有 launchMode="singleTask"
。如果 A
启动 B
,B
的实例不会在新任务中结束,而是在与 A
相同的任务中结束(见上文)。现在 B
开始 C
。 Android 创建了一个 C
的实例,并在同一任务中将其置于 B
之上。现在 C
呼叫:
startActivity(new Intent(this, B.class));
Android 创建一个 B
的新实例,并将其放在任务中 C
的顶部。现在有 2 个 B
实例,它们都不是任务的根 activity!此行为也是由于 taskAffinity
胜过启动模式。