设置launchMode="singleTask"与设置activity launchMode="singleTop"有什么区别?

87
我有一个应用程序,它的层次结构很深(活动类似于联赛>队伍>职位>球员),因此我将每个活动都设置为singleTop,以使导航合理且防止重复实例。现在我正在制作我的第二个应用程序,并看到建议将应用程序声明为singleTask以防止重复实例。有人能帮忙解释一下两种方法的优点吗?我的新应用程序只是具有3个片段的活动,然后我可能会添加设置活动和常见问题解答。编辑:我刚意识到singleTask并没有像我想象的那样防止我的应用程序重复实例。现在正在寻找正确的处理方法...

https://www.youtube.com/watch?v=Yfs4Pd4_5Tw - Deven
4个回答

104

我认为你对singleTop和singleTask的定义有些偏差。singleTop可能会产生重复的实例。让我们以你的例子为例,联赛>球队>位置>球员。如果在球员屏幕上有一个按钮可以带您到联赛屏幕,那么它将变成联赛>球队>位置>球员>联赛。

而singleTask保证该活动只能存在一个实例。


我怀疑我没有完全理解他们的定义。感谢澄清。我的主要目标是处理当用户进入联赛>团队>位置并最小化和重新进入应用程序时,它加载联赛而不是位置的情况。通过声明SingleTop,我的应用现在总是加载我离开的地方。不确定为什么singleTask不能做到这一点。 - NSouth
@NSouth,你有没有找出singletask无法执行的原因? - Emil
感谢您提供这个简单而准确的答案。 - Nadim Ansari

56

Android活动启动模式

有四种模式...

  1. "standard" 标准模式
  2. "singleTop" 单一顶部模式
  3. "singleTask" 单一任务模式
  4. "singleInstance" 单一实例模式

默认模式为"standard"标准模式。

这些模式可分为两组。 standardsingleTop在一组, singleTasksingleInstance在另一组中。

standardsingleTop的主要区别在于,在标准模式下,每次为标准活动新建意图时都会创建一个新实例。对于singleTop,也会创建一个新实例,但是如果该活动的实例已经在堆栈的顶部,则不会创建新实例。

实际上,当我们从服务器下载应用程序并打开它时,就会出现问题。打开应用程序后,按Home键。然后点击所有程序并从主屏幕选择应用程序的图标。此时,标准模式下将创建另一个活动,但在单一顶部模式下,不会创建新实例。

singleTask” 和 “singleInstance” 两种模式之间也只有一个区别:

singleTask”活动允许其他活动成为其任务的一部分。它位于活动堆栈的底部,但其他活动(必须是“standard”和“singleTop”活动)可以被启动到同一任务中。

singleInstance” 活动则不允许其他活动成为其任务的一部分。它是任务中唯一的活动。如果它启动了另一个活动,则该活动将被分配到一个不同的任务中——就像使用FLAG_ACTIVITY_NEW_TASK标志一样。

Android中的Activity启动模式


我已经阅读了很多关于这个主题的资料,但是你的答案终于让我恍然大悟,非常感谢!"分组"非常有帮助。 - avalancha

18

我在这里找到了答案: http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode

"singleTop":

与“standard”不同的是,如果当前任务栈中已经存在一个活动实例并且系统将意图路由到该活动实例,则不会创建新实例,而是会触发 onNewIntent() 方法。让我们以 Twitter-oauth 集成为例。

"singleTask":

将始终创建一个新任务,并将新实例推入任务作为根实例。但是,如果在任何任务中存在任何活动实例,则系统通过 onNewIntent() 方法调用将意图路由到该活动实例。在此模式下,活动实例可以推入同一任务。如果用户从 singleTask 活动按 BACK 键,则系统将返回用户到上一个活动。


12

来自《了解Activity的启动模式》

standard (默认):可以实例化该活动类的多个实例,并且多个实例可以添加到同一个任务或不同的任务中。这是大多数活动的常见模式。

singleTop:与standard的区别在于,如果活动的一个实例已经存在于当前任务的顶部并且系统将intent路由到该活动,则不会创建新的实例,因为它将触发onNewIntent()方法而不是创建新对象。

singleTask:将始终创建一个新任务,并将新实例推送到任务作为根。但是,如果任何活动实例存在于任何任务中,则系统通过onNewIntent()方法调用将intent路由到该活动实例。在此模式下,活动实例可以推送到同一任务中。此模式对于充当入口点的活动非常有用。

singleInstance:与singleTask相同,只是没有活动实例可以推送到单个实例任务的同一任务中。因此,具有启动模式的活动始终位于单个活动实例任务中。这是一种非常专业的模式,应仅在完全作为一个活动实现的应用程序中使用。


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