我有一个应用程序,它的主活动是一个列表,然后您可以单击项目以打开该项目的详细视图。我还有一个搜索活动,类似于主活动,并按预期工作。
但是,我希望这个搜索活动只在堆栈上有一个实例,以便用户可以多次搜索,点击返回将返回他们在开始搜索之前所在的上一个视图(而不是返回到先前的搜索结果)
singleTask和singleInstance启动模式似乎都能实现我的需求,所以我不确定我应该使用哪个以及为什么?
我有一个应用程序,它的主活动是一个列表,然后您可以单击项目以打开该项目的详细视图。我还有一个搜索活动,类似于主活动,并按预期工作。
但是,我希望这个搜索活动只在堆栈上有一个实例,以便用户可以多次搜索,点击返回将返回他们在开始搜索之前所在的上一个视图(而不是返回到先前的搜索结果)
singleTask和singleInstance启动模式似乎都能实现我的需求,所以我不确定我应该使用哪个以及为什么?
以下内容来自Android开发指南中的应用程序基础页面:
默认情况下,应用程序中的所有活动都有亲和力,即它们都属于同一个任务。
"singleInstance"活动作为其任务中唯一的活动而独立存在。如果它启动另一个活动,则无论该活动的启动模式如何,该活动都将被启动到不同的任务中,就好像FLAG_ACTIVITY_NEW_TASK在意图中一样。在其他方面,“singleInstance”模式与“singleTask”相同。
如上所述,“singleTask”或“singleInstance”活动永远不会有多个实例,因此预期该实例将处理所有新的意图。 "singleInstance"活动始终位于堆栈顶部(因为它是任务中唯一的活动),因此始终处于处理意图的位置。但是,“singleTask”活动可能具有堆栈中其上方的其他活动,如果有,则不处于处理意图的位置,而且意图会被丢弃。(即使意图被丢弃,它的到达也会导致任务进入前台,任务将保持在前台。)
由于具有启动模式的Activity永远不会有多个实例,因此在您的情况下,返回按钮将始终带您到现有的Activity实例。
一个重要的区别是,“singleTask”在选择某些东西时不需要为新启动的Activity创建新任务。也不必每次按返回按钮时都要删除该新任务。
由于您的Activity堆栈都与一个用户“任务”相关,并且听起来您没有复杂的Intent结构,其中singleInstance可能有益于始终处理它们,因此我建议使用singleTask启动模式。
这里有一篇很好的博客文章,可以获得更多信息,同时也归功于该图像:Android Activities and Tasks series – An introduction to Android’s UI component model
简单来说-
singleTask:
系统会创建一个新的任务并在新任务的根位置实例化活动。但是,如果该活动的实例已经存在于另一个任务中,则系统通过调用其onNewIntent()
方法将意图路由到现有实例,而不是创建新实例。该活动只能同时存在一个实例
。
注意:虽然活动在新任务中启动,但返回按钮仍将用户返回到先前的活动。
singleInstance:
与"singleTask"
相同,除了系统不会启动任何其他活动到持有该实例的任务中。该活动始终是其任务的唯一成员;由此启动的任何活动都会在一个单独的任务中打开。
singleTask
和singleInstance
活动只能开始一个任务。它们始终在活动堆栈的根部。此外,设备每次只能容纳一个活动实例 - 只有一个这样的任务。
更多信息,请参见android:launchMode。
singleTask
,我想补充一些内容 - 系统会创建一个新任务并在新任务的根处实例化活动。但是,如果该活动的实例已经存在于另一个任务中,则系统通过调用其 onNewIntent()
方法将意图路由到现有实例,而不是创建新实例。同一时间只能存在一个活动实例。更多信息请参见 developer.android.com。 - Rupesh Yadav
FLAG_ACTIVITY_CLEAR_TOP
,该怎么办。 - neevek