我有一个以列表为主要活动的应用程序,然后您可以单击项目,以打开该项目的详细视图。我也有一个与主要活动类似的搜索活动,并且按预期工作。
但是,我希望此搜索活动在堆栈中只有一个实例,以便用户可以搜索多次,然后单击“返回”将使它们返回到开始搜索之前所处的先前视图(而不是返回先前的搜索结果)
singleTask和singelInstance启动模式似乎都可以执行我想要的操作,因此我不确定应为此使用哪一个,为什么?
Answers:
在Android开发人员指南的“应用程序基础知识”页面中:
默认情况下,应用程序中的所有活动都具有相互关联性-也就是说,优先选择所有活动都属于同一任务。
“ singleInstance”活动是其任务中唯一的活动。如果启动另一个活动,则该活动将被启动到另一个任务中,而不管其启动方式如何-就像是FLAG_ACTIVITY_NEW_TASK的意图一样。在所有其他方面,“ singleInstance”模式与“ singleTask”相同。
如上所述,“ singleTask”或“ singleInstance”活动的实例不得超过一个,因此该实例应能处理所有新意图。“ singleInstance”活动始终位于堆栈的顶部(因为它是任务中唯一的活动),因此始终可以处理该意图。但是,“ singleTask”活动在堆栈中可能有也可能没有其他活动。如果是这样,则无法处理该意图,并且该意图将被丢弃。(即使该意图被丢弃,它的到达也将导致该任务到达将要保留的前台。)
由于在任何一种启动模式下,Activity实例都不会超过一个,因此后退按钮将始终带您进入案例中的Activity实例。
一个重要的区别是,“ singleTask”不需要为选定某些内容时要启动的新“活动”创建新任务。它也不必每次都删除后退按钮上的新任务。
由于您的“活动”堆栈确实都与一个用户“任务”相关,而且听起来好像您没有复杂的Intent结构,其中singleInstance可能总是有益于始终处理它们,所以建议您使用singleTask启动模式。
这是一篇很好的博客文章,以获取更多信息,并获得了该图片的赞誉:Android活动和任务系列– Android UI组件模型简介
FLAG_ACTIVITY_CLEAR_TOP
?
用简单的方式-
singleTask:
系统创建一个新任务,并在新任务的根目录处实例化活动。但是,如果活动的实例已经存在于单独的任务中,则系统通过调用其onNewIntent()
方法将意图路由到现有实例,而不是创建新实例。一次只能one instance
存在一个活动。
注意:尽管活动在新任务中开始,但是“后退”按钮仍使用户返回上一个活动。
singleInstance-
与此相同"singleTask"
,但系统不会在持有实例的任务中启动任何其他活动。活动始终是其任务的唯一且唯一的成员。由这个人开始的任何活动都在一个单独的任务中打开。
singleTask
并且singleInstance
活动只能开始的任务。它们始终是活动堆栈的根。而且,设备一次只能保存一个活动实例,而只能执行一个这样的任务。
更多android:launchMode。
singleTask
-系统创建一个新任务,并在新任务的根目录处实例化活动。但是,如果活动的实例已经存在于单独的任务中,则系统通过调用其onNewIntent()
方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个活动实例。以获得更多developer.android.com