Android任务和进程,SingleTask和SingleInstance

我已经阅读了Google Android Developer页面,但是任务( http://developer.android.com/guide/components/tasks-and-back-stack.html )的概念真的让我困惑。

读完之后,直到SingleTask和SingleInstance,我越来越困惑。

我想用实例来问一些问题,希望能从这些问题中得到更好的理解:

假设我有2个应用程序A和B,A有x,y,z活动; B有1,2,3个活动:

假设他们的启动模式是标准的(不使用任何意图标志)。 x是app A的主要活动; 1是app B的主要活动

1)启动应用程序A,然后x-> y – > 1,按主页button,再次启动应用程序A,我们将看到活动y或1?

2)启动应用程序A,然后x – > 1 – > y – > 2 – > z – > 3,按主页button,启动应用程序A,它将包含所有活动(x – > 1 – > y – > 2 – z – > 3),还是仅包含x – > y – > z? 如果现在启动应用程序B呢? 应用B将包含哪些活动?

现在让我们说活动1,2,3是SingleTask; x,y,z标准

3)启动应用程序A,然后x – > y – > 1 – > 2,按主页button,启动应用程序A,它将包含x – > y只包含x – > y – > 1 – > 2? 如果现在启动应用程序B呢? 应用程序B将只包含1或1 – > 2?

4)启动应用程序B,然后1 – > 2 – > 3 – > 1,将2和3被破坏?

5)启动应用程序B,然后1 – > 2 – > 3,按主页button,现在启动应用程序A,然后按x – > y – > 2,然后按回退button。现在启动应用程序B,它包含什么活动? 1 – > 3或1 – > 2 – > 3?

谢谢大家的回复和帮助!

Solutions Collecting From Web of "Android任务和进程,SingleTask和SingleInstance"

假设他们的启动模式是标准的(不使用任何意图标志)。 x是app A的主要活动; 1是app B的主要活动

1)启动应用程序A,然后x-> y – > 1,按主页button,再次启动应用程序A,我们将看到活动y或1?

你会看到活动1 。 您有一个任务,其中包含x->y->1 ,活动1位于该任务活动堆栈的顶部。 当您按HOME时,此任务将移至后台。 当您再次启动应用程序时,Android会查找任务堆栈,并将它(原封不动地)返回到前台,向您显示堆栈上的最高活动(本例中为1 )。

2)启动应用程序A,然后x – > 1 – > y – > 2 – > z – > 3,按主页button,启动应用程序A,它将包含所有活动(x – > 1 – > y – > 2 – z – > 3),还是仅包含x – > y – > z?

如上所述,你有一个单一的任务。 按HOME时,任务包含x->1->y->2->z->3并移至背景。 当您再次启动应用程序A时,任务将被提前(完整),您将在上面看到活动3

如果现在启动应用程序B呢? 应用B将包含哪些活动?

那么,这样的问题是不正确的。 你真正想知道的是“这个任务将包含哪些活动?”,但是这里是答案:

如果从主屏幕启动应用程序B,则将启动一项新任务。 这个任务将包含一个单独的活动,即1 。 这个任务与其他任务无关(仍然在后台)。 后台任务包含来自2个不同应用程序的活动的事实是无关紧要的。

现在让我们说活动1,2,3是SingleTask; x,y,z标准:

3)启动应用程序A,然后x – > y – > 1 – > 2,按回家button,启动应用程序A,它将只包含x – > y或包含x – > y – > 1 – > 2?

在活动y启动活动1 ,这将创build一个新的任务。 所以你将有一个任务包含活动x->y和第二个任务包含1 。 当活动1启动活动2所发生的事情不仅仅取决于活动的启动模式。 即使活动2被宣布为launchMode="singleTask" ,如果活动2taskAffinity与活动1taskAffinity相同(默认情况下,如果它们属于同一个应用程序),则将创build活动2在与活动1相同的任务中(即:其行为将如同活动2具有launchMode="standard" )。 但是,如果活动1和活动2具有不同的taskAffinity ,则活动2将作为新任务的根活动启动。 现在您将有3个任务,如下所示:Task1包含x->y ,Task2包含1 ,Task3包含2

如果现在启动应用程序B呢? 应用程序B将只包含1或1 – > 2?

如上所述,这取决于taskAffinity 。 如果活动12taskAffinity相同,则从HOME屏幕启动应用程序B将使包含1->2的任务进入前台。 如果活动的taskAffinity不同,则从HOME屏幕启动应用程序B将把包含活动1的任务带到前台。

4)启动应用程序B,然后1 – > 2 – > 3 – > 1,将2和3被破坏?

2号和3号不会被销毁。 假设23都具有launchMode="singleTask"那么它(再次)取决于taskAffinity设置。 假设所有活动都具有相同的taskAffinity ,那么您将有一个包含1->2->3->1 (您将有两个活动1实例),因为taskAffinity胜过了launchMode

如果所有活动都有不同的taskAffinity ,那么在1->2->3你将有3个独立的任务,每个任务包含一个单独的活动。 然后,当活动3开始活动1 ,这只会将包含活动1的任务带到前台, 不会创build活动1的新实例

5)启动应用程序B,然后1 – > 2 – > 3,按主页button,现在启动应用程序A,然后按x – > y – > 2,然后按回退button。现在启动应用程序B,它包含什么活动? 1 – > 3或1 – > 2 – > 3?

同样,这取决于taskAffinity 。 如果应用程序B的所有活动都具有相同的taskAffinity那么在1->2->3您将有一个任务。 用户按下HOMEbutton,这个任务将进入后台。 现在用户启动应用程序A创build一个新的任务。 在x->y ,第二个任务包含这2个活动。 现在活动y开始活动2 。 由于此活动的launchMode="singleTask"并且与任务中的其他活动(它们都具有taskAffinity )具有不同的taskAffinity ,因此Android将创build一个活动为2的新任务。 Android不能使用包含1->2->3的现有任务,因为该任务不包含活动2作为它的根。 当用户在2按BACK时,这将完成活动2 ,它将完成第三个任务,将用户返回到包含x->y的第二个任务,活动y位于顶部。 现在按住HOME并启动应用程序B,将现有的第一个包含1->2->3任务带到前台。

但是,如果应用程序B的所有活动都有不同的taskAffinity ,那么在1->2->3 ,将有3个独立的任务,每个任务包含一个单独的活动。 用户按HOME并启动应用程序A创build新任务(现在您有4个任务)。 第四个任务包含了这两个活动。 现在活动y开始活动2 。 Android只是将包含活动2的任务带到前台。 用户按下BACKbutton,这将完成活动2和它所在的任务(因为该任务现在为空),将用户返回到前一个任务,该任务是从应用程序A包含x->y任务。从HOME屏幕将简单地将包含活动1的任务带到前台。 您现在有3个任务:Task1包含活动1并位于前台,Task2包含活动3并位于后台,Task3包含x->y并位于后台。

笔记

我意识到这很复杂。 我的回答是从我的头上,我没有试图实际执行所有这些组合和检查(但是,我已经实施了许多这些案件,我知道它是如何工作的)。 原因是你所描述的大部分内容都不是在现实世界中完成的,所以这些例子只是理论上的而不实际的。 在现实生活中,几乎不需要使用singleTasksingleInstance启动模式,除非您正在构build您自己的HOME屏幕replace,或者您需要仔细控制应用程序在由其他应用程序启动时的行为方式。 在大多数情况下,您将永远不会有多个具有singleTasksingleInstance启动模式的singleTask

如果您使用singleInstancesingleTask ,则需要了解taskAffinity如何工作,并且还需要确保对于声明为“singleTask”或“singleInstance”的每个活动都有不同的应用程序图标(可能还有应用程序标签) 。 如果不是,则由于最近任务列表中显示的方式,用户将无法返回到正确的任务。