android 任务和进程,Android任务和进程,SingleTask和SingleInstance

Assume that their launch mode are Standard (Not using any intent

flag). And x is Main Activity of app A; 1 is Main Activity of app B.

1) Launch app A, then x-> y -> 1, press home button, launch app A

again, we will see activity y or 1?

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

2) Launch app A then x -> 1 -> y -> 2 -> z -> 3, press home button,

launch app A, it will contain all the activities (x -> 1 -> y -> 2 ->

z -> 3), or it contains x -> y -> z only?

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

How about if we launch app B

now? What activities will app B contain?

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

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

Now let’s say activities 1, 2, 3 are SingleTask; x,y,z still Standard:

3) Launch app A, then x -> y -> 1 -> 2, press home button, launch app

A, it will contain x -> y only or it contains 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个任务,如下所示:Task1包含x-> y,Task2包含1,Task3包含2.

How about if we launch app B now? app B will contain 1 only or 1 -> 2?

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

4) Launch app B, then 1 -> 2 -> 3 -> 1, will 2 and 3 be destroyed?

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) Launch app B, then 1 -> 2 -> 3, press home button, launch app A

now, then x -> y -> 2 then press back button to drop 2. Launch app B

now, what activities it contains? 1 -> 3 only or 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之后,您将有3个单独的任务,每个任务包含一个活动.用户按下HOME并启动App A创建新任务(现在您有4个任务).在x-> y之后,第四个任务包含这两个活动.现在,活动y开始活动2. Android只是将包含活动2的任务带到前台.用户按下BACK按钮,完成活动2及其所在的任务(因为该任务现在为空),将用户返回到上一个任务,该任务包含来自应用程序A的x-> y从中启动应用程序B. HOME屏幕将简单地将包含活动1的任务带到前台.您现在有3个任务:Task1包含活动1并且在前台,Task2包含活动3并且在后台,Task3包含x-> y并且在后台.

笔记

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值