Android任务和进程,SingleTask和SingleInstance

时间:2013-09-04 10:37:52

标签: android android-activity launchmode

我已阅读Google Android开发者页面,但任务(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,按主页按钮,再次启动应用程序A,我们会看到活动y或1?

2)启动app A然后x - > 1 - > y - > 2 - > z - > 3,按主页按钮,启动应用程序A,它将包含所有活动(x - > 1 - > y - > 2 - >>> 3),或者它包含x - > y - >只有z?如果我们现在推出应用B怎么样?应用B包含哪些活动?

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

3)启动应用A,然后x - > y - > 1 - > 2,按主页按钮,启动应用程序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,按主页按钮,立即启动应用程序A,然后按x - > y - > 2然后按下后退按钮2.现在启动应用程序B,它包含哪些活动? 1 - >仅限3或1 - > 2 - > 3?

感谢任何人的回复和帮助!

1 个答案:

答案 0 :(得分:16)

  

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

     

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

您会看到活动1。您在该任务的活动堆栈顶部有一个包含活动x->y->1的{​​{1}}的任务。按HOME时,此任务将移至后台。当您再次启动应用程序时,Android会找到任务堆栈并将其(完好无损)带回前台,向您显示堆栈中的顶级活动(在本例中为1)。

  

2)启动app A然后x - > 1 - > y - > 2 - > z - > 3,按home键,   启动应用A,它将包含所有活动(x - > 1 - > y - > 2 - >   z - > 3),或者它包含x - > y - >只有z?

如上所述,您只有一项任务。按HOME时,任务包含1并移至后台。当您再次启动App A时,任务将被提前(完整),您将在顶部看到活动x->1->y->2->z->3

  

如果我们启动应用B怎么样?   现在?应用B包含哪些活动?

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

如果从HOME屏幕启动App B,您将开始一项新任务。此任务将包含单个活动,即3。此任务与其他任务(仍在后台)无关。后台任务包含来自2个不同应用程序的活动这一事实无关紧要。

  

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

     

3)启动应用A,然后x - > y - > 1 - > 2,按主页按钮,启动应用程序   A,它将包含x - >仅y或它包含x - > y - > 1 - > 2?

在活动1启动活动y时,这将创建一个新任务。因此,您将拥有一个包含活动1的任务和一个包含x->y的第二个任务。当活动1启动活动1时,所发生的情况不仅取决于活动的2。即使活动launchMode被声明为2,如果活动launchMode="singleTask" taskAffinity与活动2 taskAffinity相同(其中,默认情况下,如果它们属于同一个应用程序,那么活动1将在与活动2相同的任务中创建(即:它的行为就像活动1一样2)。但是,如果活动launchMode="standard"和活动1具有不同的2,则活动taskAffinity将作为新任务中的根活动启动。现在您将有3个任务,例如:Task1包含2,Task2包含x->y,Task3包含1

  

如果我们现在推出应用B怎么样?应用B将仅包含1或1 - > 2?

如上所述,这取决于2。如果活动taskAffinitytaskAffinity的{​​{1}}相同,则从HOME屏幕启动应用B会将包含1的任务带到前台。如果活动的2不同,则从HOME屏幕启动应用B会将包含活动1->2的任务带到前台。

  

4)启动应用B,然后启动1 - > 2 - > 3 - > 1,将2和3摧毁?

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

如果所有活动都有不同的taskAffinity,那么在launchMode之后,您将拥有3个单独的任务,每个任务包含一个活动。然后,当活动taskAffinity启动活动1->2->3时,这只会将包含活动3的任务带到前台,将不会创建新的活动实例1

  

5)启动应用B,然后启动1 - > 2 - > 3,按主页按钮,启动应用程序A.   现在,然后x - > y - > 2然后按后退按钮2。启动应用程序B.   现在,它包含哪些活动? 1 - >仅限3或1 - > 2 - > 3?

同样,这取决于1。如果应用B的所有活动都具有相同的1,那么在taskAffinity之后您将拥有一项任务。用户按下HOME按钮,此任务将转到后台。现在,用户启动应用A创建新任务。在taskAffinity之后,第二个任务包含这两个活动。现在,活动1->2->3开始活动x->y。由于此活动有y且与任务中的其他活动({A}}不同2,因此Android会创建一个活动{{1}的新任务作为根。 Android无法使用包含launchMode="singleTask"的现有任务,因为该任务的根目录不包含活动taskAffinity。当用户在taskAffinity按下BACK时,这将完成将完成第三项任务的活动2,将用户返回到包含活动1->2->3的{​​{1}}的第二个任务。现在按HOME并启动应用程序B会将包含2的现有第一个任务带到前台。

但是,如果应用B的所有活动都有不同的2,那么在2之后,您将拥有3个单独的任务,每个任务包含一个活动。用户按下HOME并启动App A创建新任务(现在您有4个任务)。在x->y之后,第四个任务包含这两个活动。现在,活动y开始活动1->2->3。 Android只是将包含活动taskAffinity的任务带到前台。用户按下BACK按钮,这将完成活动1->2->3及其所在的任务(因为该任务现在为空),将用户返回到上一个任务,该任务是来自应用A的x->y。从HOME屏幕启动App B只会将包含活动y的任务带到前台。您现在有3个任务:Task1包含活动2并且在前台,Task2包含活动2并且在后台,Task3包含2并且在后台。

备注

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

如果您使用x->ysingleTask,则需要了解singleInstance的工作原理,并且还需要确保您拥有不同的应用图标(可能还有app标签) )对于声明为" singleTask'的每个活动。或者' singleInstance'。如果没有,由于最近任务列表中显示的方式,用户将无法返回正确的任务。