设置 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 种模式...
-
“标准”
“单顶”
“单一任务”
“单一实例”
默认模式是“标准”。
这些模式分为两组。 standard 和 singleTop 位于一侧,singleTask 和 singleInstance 位于另一侧。
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"的主要内容,如果未能解决你的问题,请参考以下文章
onActivityResult 与 launchMode="singleTask"?
launchMode="singleTask" 不创建新任务
当使用 startActivityForResult 启动活动时,LaunchMode "singleTop" 会被忽略
Activity 为 launchMode="SingleTask" 时,进度对话框未显示 2 次
为啥行为不同?- android:launchMode="singleTask" , android:taskAffinity="" 和 Intent.FLAG