设置 launchMode="singleTask" 与设置活动 launchMode="singleTop"

Posted

技术标签:

【中文标题】设置 launchMode="singleTask" 与设置活动 launchMode="singleTop"【英文标题】:Setting launchMode="singleTask" vs setting activity launchMode="singleTop" 【发布时间】:2014-11-04 14:30:41 【问题描述】:

我有一个非常分层的应用程序(活动类似于 League > Team > Position > Player),因此我将每个活动设置为 singleTop 以保持导航合理并防止重复实例。

现在我正在制作我的第二个应用程序,我看到它建议将我的应用程序声明为 singleTask 以防止重复实例。有人可以帮助解释每种方法的优点吗?

我的新应用只是一个包含 3 个片段的活动,然后我可能会添加一个设置活动,也许还有一个常见问题解答。

编辑:我刚刚意识到 singleTask 并没有像我想象的那样阻止我的应用程序的重复实例。现在正在寻找正确的方法来处理这个......

【问题讨论】:

youtube.com/watch?v=Yfs4Pd4_5Tw 【参考方案1】:

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

而 singleTask 保证只能存在一个 Activity 实例。

【讨论】:

我怀疑我没有完全理解他们的定义。感谢您的澄清。我的主要目标是处理当我用户转到 League > Team > Position 然后最小化并重新进入应用程序时,该应用程序正在加载 League 而不是 Position。通过声明 SingleTop,我的应用程序现在总是在我离开的地方加载。不知道为什么 singleTask 不这样做。 @NSouth 你有没有发现单任务不做的原因是什么? 感谢这个简单而准确的回答。【参考方案2】:

android 活动启动模式

4 种模式...

    “标准” “单顶” “单一任务” “单一实例”

默认模式是“标准”

这些模式分为两组。 standardsingleTop 位于一侧,singleTasksingleInstance 位于另一侧。

standard 和 singleTop 的主要区别在于标准,每次标准活动的新意图时,都会创建一个新实例。在 singleTop 的情况下,也会创建一个新实例,但该 Activity 的一个实例已经在堆栈顶部,它不会创建一个新实例。

实际上,当我们从服务器下载应用程序并启动它并从那里自行打开它时,问题就来了。启动应用程序后,按主页按钮。然后单击所有程序并从主屏幕选择应用程序的图标。然后在standard的情况下会创建另一个activity,但是在singleTop中不会创建新的实例。

singleTask”和“singleInstance”模式也仅在一个方面彼此不同:

singleTask”活动允许其他活动成为其任务的一部分。它位于活动堆栈的根部,但其他活动(必须是“标准”和“单顶”活动)可以启动到同一个任务中。

另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动被分配给不同的任务——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。

http://smartandroidians.blogspot.in/2010/04/activity-launch-mode-in-android.html

【讨论】:

【参考方案3】:

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

“单顶”:

与“标准”的不同之处在于,如果当前任务的顶部已经存在一个 Activity 实例并且系统将 Intent 路由到该 Activity,则不会创建新实例,因为它会触发 onNewIntent() 方法创建一个新对象。让我们以 Twitter-oauth 集成为例。

“单一任务”:

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

【讨论】:

【参考方案4】:

来自Understanding Activity launch mode:

标准(默认):- 活动类的多个实例可以是 实例化和多个实例可以添加到同一个任务或 不同的任务。这是大多数活动的常用模式。

singleTop :- 与标准的不同之处在于,如果 Activity 已经存在于当前任务和系统的顶部 将意图路由到此活动,不会创建新实例 因为它会触发一个 onNewIntent() 方法而不是创建一个 新对象。

singleTask:- 总是会创建一个新任务并且会创建一个新实例 以 root 身份推送到任务。但是,如果有任何活动实例 存在于任何任务中,系统将意图路由到该活动 通过 onNewIntent() 方法调用实例。在这种模式下,活动 实例可以推送到相同的任务。该模式适用于 作为入口点的活动。

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

【讨论】:

以上是关于设置 launchMode="singleTask" 与设置活动 launchMode="singleTop"的主要内容,如果未能解决你的问题,请参考以下文章

Android“单顶”启动模式和onNewIntent方法

onActivityResult 与 launchMode="singleTask"?

launchMode="singleTask" 不创建新任务

当使用 startActivityForResult 启动活动时,LaunchMode "singleTop" 会被忽略

Activity 为 launchMode="SingleTask" 时,进度对话框未显示 2 次

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