关于Android的启动模式"singleTask"

39

我阅读了Android开发者指南和一些互联网文章,但我仍然对singleTasklaunchmode感到困惑。让我们来看一个例子:

用户启动App1,Android会启动一个新的任务。假设App1按照以下顺序创建活动:

ActivityA -> ActivityB -> ActivityC

这就是task1的样子。

然后用户点击了主页按钮并选择启动App2,因此task1进入后台,Android启动了一个新任务:task2。用户做了一些操作:

ActivityD -> ActivityE

现在假设ActivityE尝试启动ActivityB,而ActivityB的启动模式为singleTask

我的理解是task1再次回到前台,task2进入后台。现在task1看起来像这样:

ActivityA -> ActivityB
这意味着:
  1. ActivityC 将从 task1 中移除,而 ActivityB 成为顶部 Activity。

  2. 如果用户现在点击“返回”按钮,他将回到 task1 的 ActivityA,而不是返回到 task2 的 ActivityE

我理解的对吗?
谢谢。
3个回答

22

2
谢谢,但我困惑的是这个文档:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode它说:“相比之下,“singleTask”和“singleInstance”活动只能开始一个任务。它们总是在活动堆栈的根部。” - cn1h
2
演示中有一个错误。当您启动一个语言模式为“singleTask”的新活动时,该活动将始终在新任务中创建。但实际上,只有在为该活动设置了taskAffinity后,它才会在新任务中创建。 - smileVann

11
The ActivityC will be removed from task1 and ActivityB becomes the top Activity.
是的,你是正确的...。
ActivityC将从Task中被移除,即ActivityC的onDestroy方法将被调用。因此,当用户再次启动Task 1时,显示的是ActivityB而不是ActivityC。
已创建2个Tasks(项目)并上传到SendSpace。试一下...
如果您查看Android的文档,它说:
“singleTask”活动允许其他活动成为其任务的一部分。它始终位于其任务的根部,但其他活动(必须是“标准”和“singleTop”活动)可以启动到该任务中。
这意味着当您点击主页按钮时,单任务活动(在您的情况下是ActivityB)上方的所有活动都会从堆栈中删除。
在示例中,如果您只运行“AndroidTest”项目并按主页按钮,在日志中,您可以看到第二个Activity被暂停,当您从“最近使用的应用程序”列表中重新启动时,第二个Activity被销毁。
在一个场景中,如果Single Instance Activities(ActivityB)上面的Activities没有从Back Stack中移除,并且另一个应用程序请求此Activity(ActivityB),则可能不会显示ActivityB,并且Intent可能会被丢弃。但是,这种情况发生的可能性非常小,因为用户必须按Home按钮并将当前Task / App放入BackStack中,然后才能导航到另一个Task / App。
因此,强烈建议不要使用singleTask和singleInstance模式,因为它们会导致与用户熟悉的大多数其他应用程序非常不同的交互模型。
希望这可以解决您的疑虑。

谢谢,但是这篇文章中的答案让我感到困惑: https://dev59.com/rXA75IYBdhLWcg3wlqAT“singleTask”或“singleInstance”活动永远不会有多个实例,因此该实例应处理所有新意图... 但是,“singleTask”活动可能具有堆栈中其上方的其他活动。 如果有,则它无法处理意图,并且意图被丢弃。(即使意图被丢弃,它的到来也会导致任务进入前台,保持在那里。) - cn1h
1
这意味着当您点击主页按钮时,所有位于单任务活动(在您的情况下为ActivityB)上方的活动都将从堆栈中移除。我在一个项目中发现了这个情况。谢谢。 - Lou Morda
"Sendspace"链接已损坏。 - Salim Mahboubi
“其他模式- singleTask...”?“singleTask”是不同于“singleTask”的另一种模式吗?这里肯定有什么问题... - The incredible Jan
我刚刚创建了一个应用程序演示来测试语句“这意味着当您单击主页按钮时,所有在单任务活动(在您的情况下为ActivityB)上方的活动都将从堆栈中删除。”但是与答案相反,单任务活动上方的活动仍然存在于内存中。 - Varun Ajay Gupta

2

每当启动singleTask活动时,它都会清除当前位于其上方的所有活动并将其置于前台。如果您的singleTask活动在顶部,则会像singleTop一样运行。

P.S - onCreate不会被调用第二次,而是会调用onNewIntent。

请查看此链接,其中非常详细地解释了启动模式。 https://medium.com/android-news/android-activity-launch-mode-e0df1aa72242


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接