2010-07-10 74 views
81

我有一个应用程序,其中包含一个列表作为其主要活动,然后您可以单击打开该项目的详细视图的项目。我也有一个类似于主要活动的搜索活动,并按预期工作。Android singleTask或singleInstance启动模式?

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

singleTask和singelInstance启动模式似乎做我想要的,所以我不知道哪一个我应该用于这个目的,为什么?

回答

139

Application Fundamentals页的Android开发人员指南:

默认情况下,在 应用程序的所有活动,为每个 其他的亲和力 - 那就是,有一个为他们都属于偏好 到相同的 任务。

“singleInstance”活动仅代表 作为其 任务中的唯一活动。如果它启动另一个活动,则该活动将被启动到 不同的任务中,而不管其启动模式为 - 好像 FLAG_ACTIVITY_NEW_TASK在 意图中。在所有其他方面, “singleInstance”模式与 “singleTask”相同。

如上所述,从未有更多 比一个“singleTask”或 “singleInstance”活动的情况下,使 实例预计处理所有新 意图。 “单实例”活动 始终位于堆栈顶部 (因为它是 任务中的唯一活动),所以它始终处于处理意图的位置。但是, “singleTask”活动可能会或可能不会 在 堆栈中有其他活动。如果是这样,则不会在 的位置处理该意图,并且 意图被丢弃。 (即使 意图被丢弃,它的到来将 造成任务前来 前景,它将会继续存在。)

4 Activities in a Task

因为从来就没有超过一个实例无论是启动模式下的活动,后退按钮将始终带您到您案例中活动的现有实例。

一个重要的区别是,“singleTask”不需要为选择某项内容的新活动创建新任务。也不必每次都在后退按钮上删除新的任务。由于你的活动堆栈都属于一个用户的“任务”,并且听起来不像你有一个错综复杂的Intent结构,其中singleInstance可能有利于总是处理它们,所以我建议使用singleTask启动模式。

这里是一个很好的博客文章获得更多信息,以及贷记图像:Android Activities and Tasks series – An introduction to Android’s UI component model

+3

谢谢!看起来像一个很好的阅读...事情是四实现我真的想要一个活动的多个实例,只有当前台活动是一个搜索活动,并执行另一个搜索,如果它使用现有的活动(如市场如何运作) 而为此,singeTop正是什么林后,但感谢帮助反正=) 谢谢 – Kman 2010-07-11 01:55:25

+1

嘿,谢谢。这篇写得很好的文章帮助我掐了一下。 – icecreamman 2011-08-25 21:20:06

+0

感谢您的详细信息,尤其是这一项*(即使意图已经被放弃,它的到来也会导致任务到达前台,并保持原样),这立即消除了我的困惑。我只是想着如果singleTask Activity不在堆栈的顶部,而我仍然想要导航到它而不指定“FLAG_ACTIVITY_CLEAR_TOP”。 – neevek 2013-07-09 15:52:51

4

singleTasksingleInstance活动只能开始的任务。它们始终处于活动堆栈的根部。而且,该设备一次只能保存一个活动实例 - 只有一个这样的任务。
更多android:launchMode

+0

最后一句对于singleInstance而言是true,而不是singleTask – 2018-01-15 11:45:01

+0

@SerdarS。感谢您的评论。添加更多关于'singleTask'的信息 - 系统创建一个新任务并在新任务的根目录下实例化活动。但是,如果一个活动的实例已经存在于一个单独的任务中,则系统通过调用其onNewIntent()方法将该意图路由到现有实例,而不是创建新实例。一次只能有一个活动实例。为更多[developer.android.com](https://developer.android.com/guide/components/activities/tasks-and-back-stack.html) – 2018-01-15 12:37:06

+0

明白了,然后我错了。很抱歉打扰。 – 2018-01-15 13:26:38

27

在一个简单的way-

singleTask:

系统将创建一个新的任务和新任务的根实例化的活动。但是,如果活动的实例已经存在于单独的任务中,则系统通过调用其方法来将该意图路由到现有实例,而不是创建新的实例。一次只能存在活动的one instance

注意:尽管活动在新任务中启动,但后退按钮 仍会将用户返回到上一个活动。

singleInstance-

"singleTask",除了不启动任何其他活动纳入控股实例任务系统。该活动始终是其任务中唯一且唯一的成员; 此活动开始的任何活动都在单独的任务中打开。

相关问题