Android的singleTask或singleInstance启动模式?

84

我有一个应用程序,它的主活动是一个列表,然后您可以单击项目以打开该项目的详细视图。我还有一个搜索活动,类似于主活动,并按预期工作。

但是,我希望这个搜索活动只在堆栈上有一个实例,以便用户可以多次搜索,点击返回将返回他们在开始搜索之前所在的上一个视图(而不是返回到先前的搜索结果)

singleTask和singleInstance启动模式似乎都能实现我的需求,所以我不确定我应该使用哪个以及为什么?

3个回答

141

以下内容来自Android开发指南中的应用程序基础页面:

默认情况下,应用程序中的所有活动都有亲和力,即它们都属于同一个任务。

"singleInstance"活动作为其任务中唯一的活动而独立存在。如果它启动另一个活动,则无论该活动的启动模式如何,该活动都将被启动到不同的任务中,就好像FLAG_ACTIVITY_NEW_TASK在意图中一样。在其他方面,“singleInstance”模式与“singleTask”相同。

如上所述,“singleTask”或“singleInstance”活动永远不会有多个实例,因此预期该实例将处理所有新的意图。 "singleInstance"活动始终位于堆栈顶部(因为它是任务中唯一的活动),因此始终处于处理意图的位置。但是,“singleTask”活动可能具有堆栈中其上方的其他活动,如果有,则不处于处理意图的位置,而且意图会被丢弃。(即使意图被丢弃,它的到达也会导致任务进入前台,任务将保持在前台。)

4 Activities in a Task

由于具有启动模式的Activity永远不会有多个实例,因此在您的情况下,返回按钮将始终带您到现有的Activity实例。

一个重要的区别是,“singleTask”在选择某些东西时不需要为新启动的Activity创建新任务。也不必每次按返回按钮时都要删除该新任务。

由于您的Activity堆栈都与一个用户“任务”相关,并且听起来您没有复杂的Intent结构,其中singleInstance可能有益于始终处理它们,因此我建议使用singleTask启动模式。

这里有一篇很好的博客文章,可以获得更多信息,同时也归功于该图像:Android Activities and Tasks series – An introduction to Android’s UI component model


4
谢谢!看起来是一篇不错的文章……问题在于我已经意识到我实际上需要多个活动实例,只有当前台活动是搜索活动并且进行另一个搜索时才应该使用现有的活动(就像市场的工作方式一样)。单顶模式(singeTop)正是我想要的,但还是感谢您的帮助=)谢谢。 - Kman
1
嘿,谢谢。这篇写得很好的帖子在我急需时给了我帮助。 - icecreamman
感谢提供详细信息,特别是这一点*(即使意图被丢弃,它的到来也会导致任务进入前台,并保持在那里。)*,它立即解决了我的困惑。我正在考虑的是,如果一个singleTask Activity不在堆栈的顶部,而我仍然想要导航到它,而不指定FLAG_ACTIVITY_CLEAR_TOP,该怎么办。 - neevek
必读 "http://androidsrc.net/android-activity-launch-mode-example/" - Dhiraj Himani

30

简单来说-

singleTask:

系统会创建一个新的任务并在新任务的根位置实例化活动。但是,如果该活动的实例已经存在于另一个任务中,则系统通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。该活动只能同时存在一个实例

注意:虽然活动在新任务中启动,但返回按钮仍将用户返回到先前的活动。

singleInstance:

"singleTask"相同,除了系统不会启动任何其他活动到持有该实例的任务中。该活动始终是其任务的唯一成员;由此启动的任何活动都会在一个单独的任务中打开


4

singleTasksingleInstance活动只能开始一个任务。它们始终在活动堆栈的根部。此外,设备每次只能容纳一个活动实例 - 只有一个这样的任务。
更多信息,请参见android:launchMode


1
最后一句话是针对singleInstance的,而不是singleTask。 - Serdar Samancıoğlu
@SerdarS. 感谢您的评论。关于 singleTask,我想补充一些内容 - 系统会创建一个新任务并在新任务的根处实例化活动。但是,如果该活动的实例已经存在于另一个任务中,则系统通过调用其 onNewIntent() 方法将意图路由到现有实例,而不是创建新实例。同一时间只能存在一个活动实例。更多信息请参见 developer.android.com - Rupesh Yadav
明白了,那我错了。抱歉打扰了。 - Serdar Samancıoğlu

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