Android singleTask 还是 singleInstance 启动模式? [关闭]

Posted

技术标签:

【中文标题】Android singleTask 还是 singleInstance 启动模式? [关闭]【英文标题】:Android singleTask or singleInstance launch mode? [closed] 【发布时间】:2011-03-14 06:43:30 【问题描述】:

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

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

singleTask 和singelInstance 启动模式似乎都可以满足我的要求,所以我不确定我应该使用哪一个来实现此目的以及为什么?

【问题讨论】:

【参考方案1】:

来自 android 开发指南的Application Fundamentals 页面:

默认情况下,一个 应用程序对每个都有亲和力 其他——也就是说,有一个偏好 让他们都属于同一个 任务。

一个“singleInstance”活动代表 单独作为其唯一的活动 任务。如果它开始另一个活动, 该活动将启动为 不同的任务,不管它 启动模式——好像 FLAG_ACTIVITY_NEW_TASK 在 意图。在所有其他方面, “singleInstance”模式等同于 “单一任务”。

如上所述,没有更多 比“singleTask”的一个实例或 “singleInstance”活动,这样 实例预计将处理所有新的 意图。 “单一实例”活动 总是在栈顶 (因为它是唯一的活动 任务),所以它总是可以 处理意图。然而,一个 “singleTask”活动可能会也可能不会 在它上面有其他活动 堆。如果有,则不在 处理意图的位置,以及 意图被放弃。 (尽管 意图被放弃,它的到来将 已经导致任务来到 前景,它将保留在哪里。)

由于任何一种启动模式都不会有超过一个 Activity 实例,因此后退按钮将始终将您带到您的情况下的现有 Activity 实例。

一个重要的区别是“singleTask”不需要在选择某项时为正在启动的新活动创建新任务。也不必每次都删除后退按钮上的新任务。

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

这是一篇很好的博文,可以了解更多信息,以及图片的功劳:Android Activities and Tasks series – An introduction to Android’s UI component model

【讨论】:

谢谢!看起来不错……事情是 iv 意识到我实际上想要一个活动的多个实例,并且只有当前台活动是搜索活动并且执行另一个搜索时,它才应该使用现有活动(如市场如何运作)并且因为 singeTop 正是我所追求的,但无论如何感谢您的帮助 =) 谢谢 嘿,谢谢。这篇写得很好的文章在紧要关头帮助了我。 感谢您提供详细信息,尤其是这个(即使意图被放弃,它的到来也会导致任务来到前台,它会保留在那里。) ,这立即消除了我的困惑。我只是在想,如果一个 singleTask Activity 不在堆栈的顶部,而我仍然想在不指定 FLAG_ACTIVITY_CLEAR_TOP 的情况下导航到它。 必读“androidsrc.net/android-activity-launch-mode-example”【参考方案2】:

singleTasksingleInstance 活动只能开始一个任务。它们始终位于活动堆栈的根部。此外,该设备一次只能保存一个 Activity 实例——只有一个这样的任务。了解更多android:launchMode。

【讨论】:

最后一句话是singleInstance的,不是singleTask的 @SerdarS。感谢您的评论。添加更多关于 singleTask 的信息 - 系统创建一个新任务并在新任务的根目录下实例化活动。但是,如果活动的实例已经存在于单独的任务中,系统会通过调用其onNewIntent() 方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。更多developer.android.com 知道了,那我错了。抱歉打扰了。【参考方案3】:

以简单的方式-

单任务:

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

注意:虽然活动在新任务中开始,但“后退”按钮 仍将用户返回到上一个活动。

singleInstance-

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

【讨论】:

以上是关于Android singleTask 还是 singleInstance 启动模式? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android:恢复 singleTask 活动

android singleTask 活动不作为根?

为啥行为不同?- android:launchMode="singleTask" , android:taskAffinity="" 和 Intent.FLAG

解开Android应用程序组件Activity的"singleTask"之谜

Android中维护标准应用Activity回栈状态(使用singleTask启动模式)

android:Activity启动模式之singleTask