设置launchMode =“singleTask”vs设置activity launchMode =“singleTop”

我有一个非常分层的应用程序(活动类似于“联赛”>“团队”>“位置”>“玩家”),所以我将每个活动设置为“ singleTop以保持导航的合理性并防止重复的实例。

现在我正在做我的第二个应用程序,我已经看到它build议声明我的应用程序是singleTask以防止重复的情况。 有人可以帮助解释每种方法的优点吗?

我的新应用程序只是一个3片段的活动,然后我可能会添加一个设置活动,也许一个常见问题。

编辑:我只是意识到singleTask不是防止我的应用程序的重复实例,因为我曾以为。 现在寻找正确的方式来处理这个…

我认为你对singleTop和singleTask的定义有点不合适。 SingleTop可以产生一个重复的实例。 让我们用你的例子,League> Team> Position> Player。 如果玩家屏幕上有一个button可以进入联盟屏幕,它将成为联赛>队伍>位置>玩家>联赛。

而singleTask则保证只有一个活动的实例可以存在。

Android活动launchMode

4种模式…

“standard”“singleTop”“singleTask”“singleInstance”

默认模式是“标准”。

模式分为两组。 标准和singleTop来到一边,singleTask和singleInstance来到另一边。

standard和singleTop之间的主要区别是标准的,每当一个新的标准活动的意图,就创build一个新的实例。 在singleTop的情况下,创build一个新的实例,但活动的一个实例已经在栈顶,它不会创build一个新的实例。

其实,问题出现了,当我们从服务器上下载一个应用程序,并启动它,并从那里打开它。 启动应用程序后,按主页button。 然后点击所有程序并从主屏幕select应用程序的图标。 然后在标准的情况下创build另一个活动,但是在singleTop中不会创build新的实例。

“singleTask”和“singleInstance”模式在一个方面也有所不同:“singleTask”活动允许其他活动成为其任务的一部分。 它是活动堆栈的根源,但其他活动(必须是“标准”活动和“单个活动”)可以启动到同一个任务中。 另一方面,“单一实例”活动不允许其他活动成为其任务的一部分。 这是唯一的任务。 如果它启动另一个活动,那么该活动将被分配给其他任务 – 就像FLAG_ACTIVITY_NEW_TASK在意图中一样。

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

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

“singleTop”:

与“标准”的不同之处在于,如果活动的实例已经存在于当前任务的顶部,并且系统向该活动路由意图,则不会创build新的实例,因为它将触发onNewIntent()方法而不是创build新的对象。 以Twitter-oauth集成为例。

“singleTask”:

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

从了解活动启动模式 :

标准(默认): – 活动类的多个实例可以被实例化,多个实例可以被添加到相同的任务或不同的任务。 这是大多数活动的共同模式。

singleTop:与标准的不同之处在于,如果活动的一个实例已经存在于当前任务的顶部,并且系统将意图传递给该活动,则不会创build新的实例,因为它会触发onNewIntent()方法而不是创build一个新的对象。

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

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