我有一个以列表为主要活动的应用,然后您可以点击打开该项目详细视图的项目。我还有一个类似于主要活动的搜索活动,并按预期工作。
但是,我希望此搜索活动只在堆栈上有一次实例,以便用户可以多次搜索并单击返回将它们返回到他们开始搜索之前所处的前一个视图(而不是返回到前一个搜索结果)
singleTask和singelInstance启动模式似乎都是我想要的,所以我不确定我应该为此目的使用哪一个以及为什么?
答案 0 :(得分:141)
从Android开发指南的Application Fundamentals页面:
默认情况下,一个中的所有活动 应用程序对每个都有亲和力 其他 - 也就是说,有偏好 因为他们都属于同一个人 任务。
“singleInstance”活动代表 独自作为其唯一的活动 任务。如果它开始另一个活动, 该活动将发布到 不管它有什么不同的任务 启动模式 - 好像 FLAG_ACTIVITY_NEW_TASK出现在 意图。在所有其他方面, “singleInstance”模式与之相同 “singleTask”。
如上所述,永远不会有更多 而不是“singleTask”的一个实例 “singleInstance”活动,这样 实例有望处理所有新的 意图。 “singleInstance”活动 总是在堆栈的顶部 (因为它是唯一的活动 任务),所以它始终在位 处理意图。但是,一个 “singleTask”活动可能会也可能不会 在其上面有其他活动 堆。如果确实如此,则不在 处理意图的位置,以及 意图被删除。 (尽管如此 意图被取消,它的到来会 已经导致任务来到了 前景,它将留在哪里。)
由于具有任何一种启动模式的活动永远不会有一个实例,因此后退按钮将始终将您带到您案例中现有的活动实例。
一个重要的区别是“singleTask”不需要为选择内容时启动的新活动创建新任务。也不必每次都在后退按钮上删除新任务。
由于你的Activity堆栈都属于一个用户“任务”,并且听起来你没有一个错综复杂的Intent结构,其中singleInstance可能总是有效处理它们,我建议使用singleTask启动模式。 / p>
这是一篇很好的博客文章,可以获取更多信息,以及图片来源:Android Activities and Tasks series – An introduction to Android’s UI component model
答案 1 :(得分:30)
以简单的方式 -
<强> singleTask:强>
系统创建新任务并在新任务的根目录下实例化活动。但是,如果活动的实例已存在于单独的任务中,则系统会通过调用其onNewIntent()
方法将意图路由到现有实例,而不是创建新实例。一次只能存在one instance
个活动。
注意:虽然活动在新任务中启动,但“后退”按钮 仍然将用户返回到上一个活动。
<强> singleInstance - 强>
与"singleTask"
相同,但系统不会在持有实例的任务中启动任何其他活动。活动始终是其任务的唯一成员; 在此单独任务中打开的任何活动。
答案 2 :(得分:4)
singleTask
和singleInstance
活动只能开始执行任务。它们始终位于活动堆栈的根部。此外,设备一次只能容纳一个活动实例 - 只有一个这样的任务。
更多android:launchMode。