Android singleTask或singleInstance启动模式?[关闭]


84

我有一个以列表为主要活动的应用程序,然后您可以单击项目,以打开该项目的详细视图。我也有一个与主要活动类似的搜索活动,并且按预期工作。

但是,我希望此搜索活动在堆栈中只有一个实例,以便用户可以搜索多次,然后单击“返回”将使它们返回到开始搜索之前所处的先前视图(而不是返回先前的搜索结果)

singleTask和singelInstance启动模式似乎都可以执行我想要的操作,因此我不确定应为此使用哪一个,为什么?

Answers:


141

在Android开发人员指南的“应用程序基础知识”页面中:

默认情况下,应用程序中的所有活动都具有相互关联性-也就是说,优先选择所有活动都属于同一任务。

“ singleInstance”活动是其任务中唯一的活动。如果启动另一个活动,则该活动将被启动到另一个任务中,而不管其启动方式如何-就像是FLAG_ACTIVITY_NEW_TASK的意图一样。在所有其他方面,“ singleInstance”模式与“ singleTask”相同。

如上所述,“ singleTask”或“ singleInstance”活动的实例不得超过一个,因此该实例应能处理所有新意图。“ singleInstance”活动始终位于堆栈的顶部(因为它是任务中唯一的活动),因此始终可以处理该意图。但是,“ singleTask”活动在堆栈中可能有也可能没有其他活动。如果是这样,则无法处理该意图,并且该意图将被丢弃。(即使该意图被丢弃,它的到达也将导致该任务到达将要保留的前台。)

4任务中的活动

由于在任何一种启动模式下,Activity实例都不会超过一个,因此后退按钮将始终带您进入案例中的Activity实例。

一个重要的区别是,“ singleTask”不需要为选定某些内容时要启动的新“活动”创建新任务。它也不必每次都删除后退按钮上的新任务。

由于您的“活动”堆栈确实都与一个用户“任务”相关,而且听起来好像您没有复杂的Intent结构,其中singleInstance可能总是有益于始终处理它们,所以建议您使用singleTask启动模式。

这是一篇很好的博客文章,以获取更多信息,并获得了该图片的赞誉:Android活动和任务系列– Android UI组件模型简介


4
谢谢!看起来像是一本不错的书...事情已经很明显地实现了,我实际上想要一个活动的多个实例,并且只有当前景活动是搜索活动并且执行另一个搜索时,它才应使用该现有活动(例如市场的运作方式),为此,singeTop正是Im所追求的,但无论如何还是感谢您的帮助=)谢谢
Kman 2010年

1
嘿,谢谢。这篇写得很好的文章对我有所帮助。
icecreamman

感谢您提供的细节,尤其是这一细节(即使意图被放弃,它的到来也会使任务到达前台,并保留在那里。),这立即使我感到困惑。我只是在考虑如果singleTask活动不在堆栈的顶部,而我仍然想导航到它而不指定它,该怎么办FLAG_ACTIVITY_CLEAR_TOP
neevek 2013年


30

用简单的方式-

singleTask:

系统创建一个新任务,并在新任务的根目录处实例化活动。但是,如果活动的实例已经存在于单独的任务中,则系统通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。一次只能one instance存在一个活动。

注意:尽管活动在新任务中开始,但是“后退”按钮仍使用户返回上一个活动。

singleInstance-

与此相同"singleTask",但系统不会在持有实例的任务中启动任何其他活动。活动始终是其任务的唯一且唯一的成员。由这个人开始的任何活动都在一个单独的任务中打开


4

singleTask并且singleInstance活动只能开始的任务。它们始终是活动堆栈的根。而且,设备一次只能保存一个活动实例,而只能执行一个这样的任务。
更多android:launchMode


1
最后一句话适用于singleInstance,而不是singleTask
SerdarSamancıoğlu,

@SerdarS。感谢您的评论。添加更多有关singleTask-系统创建一个新任务,并在新任务的根目录处实例化活动。但是,如果活动的实例已经存在于单独的任务中,则系统通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。以获得更多developer.android.com
Rupesh Yadav '18

知道了,那我就错了。很抱歉打扰。
SerdarSamancıoğlu18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.