If activities 1, 2, and 3 are SingleTask and x, y, z are Standard:
When you launch App A and navigate to x->y->1->2
, the task now contains x->y->1->2
with activity 2
on top. When you press HOME, this task is moved to the background. When you launch App A again, Android finds the existing task stack and brings it (intact) back to the foreground. Since activities 1 and 2 are single task and already exist in the task stack, Android clears all activities on top of them and shows activity 2
on top. Therefore, you will see activities x->y->1->2
.
当活动
y
启动活动
1
时,这将创建一个新任务。因此,您将有包含活动
x->y
的一个任务和包含
1
的第二个任务。当活动
1
启动活动
2
时,发生的情况取决于不仅是活动的
launchMode
,还包括其他因素。即使活动
2
声明为
launchMode="singleTask"
,如果活动
2
的
taskAffinity
与活动
1
的
taskAffinity
相同(默认情况下,如果它们属于同一应用程序,则是这样),则活动
2
将在与活动
1
相同的任务中创建(即:它的行为就像活动
2
的
launchMode="standard"
)。但是,如果活动
1
和活动
2
具有不同的
taskAffinity
,那么活动
2
将在新任务中作为根活动启动。现在,您将有3个任务,如下所示:任务1包含
x->y
,任务2包含
1
,任务3包含
2
。
如果现在启动应用程序B会怎样? 应用程序B只包含1还是1 -> 2?
与上述相同,这取决于
taskAffinity
。如果活动
1
和
2
的
taskAffinity
相同,则从主屏幕启动应用程序B将使包含
1->2
的任务处于前台。如果活动的
taskAffinity
不同,则从主屏幕启动应用程序B将使包含活动
1
的任务处于前台。
4)启动应用程序B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?
不会。
2
和
3
不会被销毁。假设
1
、
2
和
3
都具有
launchMode="singleTask"
,则(再次)取决于
taskAffinity
设置。假设所有活动具有相同的
taskAffinity
,那么您将拥有包含
1->2->3->1
的单个任务(您将拥有2个活动
1
实例),因为
taskAffinity
胜过
launchMode
。如果所有活动都具有不同的“taskAffinity”,那么在1->2->3之后,您将拥有3个单独的任务,每个任务包含一个活动。然后,当活动3启动活动1时,这只会将包含活动1的任务带到前台,而不会创建活动1的新实例。
5)启动应用程序B,然后1-> 2-> 3,按Home键,现在启动应用程序A,然后 x->y->2,然后按返回按钮放弃2。现在启动应用程序B,它包含什么活动?只有1->3还是1->2->3?
同样,这取决于“taskAffinity”。如果应用程序B的所有活动具有相同的“taskAffinity”,则在1->2->3之后,您将拥有一个任务。用户按HOME按钮,此任务将进入后台。现在用户启动应用程序A,创建一个新任务。在x->y之后,第二个任务包含这两个活动。现在活动y启动活动2。由于此活动具有“launchMode =”singleTask“”并且具有与该任务中其他活动不同的“taskAffinity”(它们都具有App A的“taskAffinity”),因此Android将创建一个新任务,其中包含活动2作为根。 Android无法使用包含1->2->3的现有任务,因为该任务不包含2作为其根。当用户在2中按BACK时,这将完成活动2,从而完成第三个任务,将用户返回到包含x->y的第二个任务,并在顶部放置活动y。现在按HOME并启动应用程序B将使现有的第一个任务(包含1->2->3)前台显示。然而,如果应用程序B的所有活动都具有不同的“taskAffinity”,那么在1->2->3之后,您将拥有包含单个活动的三个单独任务。用户按HOME键并启动App A创建一个新任务(现在有4个任务)。在x->y之后,第四个任务包含这两个活动。现在活动y启动活动2。Android只是将包含活动2的任务置于前台。用户按BACK按钮,这会完成活动2以及它所在的任务(因为该任务现在为空),将用户返回到先前的任务,即包含来自应用程序A的x->y的任务。从主屏幕启动App B只会将包含活动1的任务置于前台。现在您有3个任务:Task1包含活动1并位于前台,Task2包含活动3并位于后台,Task3包含x->y并位于后台。
注:
我意识到这很复杂。我的答案来自我的头脑,我没有尝试实现所有这些组合并检查(但是,我过去实现了许多这些情况,并且确实知道它的工作原理)。原因是你描述的大部分内容在现实世界中不会被使用,因此这些示例仅是理论的而非实际的。在实际生活中,除非您正在构建自己的HOME屏幕替代品或需要仔细控制应用程序在被其他应用程序启动时的行为,否则您几乎永远不需要使用singleTask或singleInstance启动模式。在大多数情况下,您将永远不会有一个具有singleTask或singleInstance启动模式的活动超过一个。
如果您使用singleInstance或singleTask,则需要了解taskAffinity的工作方式,并确保每个声明为“singleTask”或“singleInstance”的活动都具有不同的应用程序图标(和可能还有应用程序标签)。如果没有,由于这些在最近任务列表中的显示方式,用户将无法返回到正确的任务。
taskAffinity
在singleTask
和singleInstance
中扮演如此重要的角色。非常感谢您的经验分享! - Sam YC