我有一个非常分层的应用程序(活动类似于联盟>团队>位置>播放器),所以我已经完成了每个活动singleTop
,以保持导航合理并防止重复实例。
现在我正在创建我的第二个应用程序并且我已经看到它建议将我的应用程序声明为singleTask
以防止重复实例。有人可以帮助解释每种方法的优势吗?
我的新应用只是一个包含3个片段的活动,然后我可能会添加一个设置活动,也许还有一个FAQ。
编辑:我刚才意识到singleTask
并没有像我想象的那样阻止我的应用重复实例。现在正在寻找处理这个问题的正确方法......
答案 0 :(得分:68)
我认为你对singleTop和singleTask的定义有点偏。 SingleTop可以生成一个重复的实例。让我们用你的例子,联盟>团队>位置>播放器。如果播放器屏幕中有一个按钮,您将进入联盟屏幕,它将成为联盟>团队>位置>播放器>联赛。
而singleTask保证只能存在一个活动实例。
答案 1 :(得分:25)
Android活动launchMode
4种模式......
"标准" " singleTop" " singleTask" " singleInstance"
默认模式为"标准"。
模式分为两组。标准和singleTop在一侧,singleTask和singleInstance在另一侧。
标准和singleTop之间的主要区别在于标准,每次创建标准活动的新意图时,都会创建一个新实例。如果是singleTop,则会创建一个新实例,但活动的实例已经位于堆栈的顶部,它不会创建新实例。
实际上,当我们从服务器下载应用程序并启动它并从那里打开它时,问题就出现了。启动应用程序后,按主页按钮。然后单击所有程序并从主屏幕中选择应用程序的图标。然后,在标准的情况下将创建另一个活动,但在singleTop中,将不会创建新实例。
" singleTask"和" singleInstance"模式在一个方面也各不相同:A" singleTask"活动允许其他活动成为其任务的一部分。它位于活动堆栈的根部,但其他活动(必然"标准"和#34; singleTop"活动)可以启动到同一任务中。 A" singleInstance"另一方面,活动不允许任何其他活动成为其任务的一部分。它是该任务中唯一的活动。如果它启动另一个活动,则该活动将分配给另一个任务 - 就像FLAG_ACTIVITY_NEW_TASK在意图中一样。
http://smartandroidians.blogspot.in/2010/04/activity-launch-mode-in-android.html
答案 2 :(得分:15)
我在这里找到答案: http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode
<强>&#34; singleTop&#34;:强>
与标准的区别&#39;是,如果活动的实例已经存在于当前任务的顶部并且系统将意图路由到此活动,则不会创建新实例,因为它将触发onNewIntent()方法而不是创建新对象。我们以Twitter-oauth集成为例。
<强>&#34; singleTask&#34;:强>
将始终创建新任务,并将新实例作为根任务推送到任务。但是,如果任何任务中存在任何活动实例,系统会通过onNewIntent()方法调用将意图路由到该活动实例。在此模式下,活动实例可以推送到同一任务。如果用户单击singleTask活动中的BACK键,系统会将用户返回到上一个活动。
答案 3 :(得分:5)
来自Understanding Activity launch mode:
标准(默认): - 活动类的多个实例可以是 实例化,多个实例可以添加到同一个任务或 不同的任务。这是大多数活动的共同模式。
singleTop: - 与标准的区别在于,如果是一个实例 活动已经存在于当前任务和系统的顶部 将意图路由到此活动,不会创建新实例 因为它将触发onNewIntent()方法而不是创建一个 新对象。
singleTask: - 将始终创建一个新任务,并且将创建一个新实例 被推到根任务。但是,如果有任何活动实例 在任何任务中,系统将意图路由到该活动 实例通过onNewIntent()方法调用。在这种模式下,活动 实例可以推送到同一个任务。此模式非常有用 作为切入点的活动。
singleInstance: - 与singleTask相同,但no活动除外 实例可以被推送到singleInstance的同一个任务中。 因此,启动模式下的活动始终是单一的 活动实例任务。这是一种非常专业的模式,应该 仅用于完全作为一个实现的应用程序 活性。