84

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

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

singleTask 和singelInstance 启动模式似乎都可以满足我的要求,所以我不确定我应该为此目的使用哪个,为什么?

4

3 回答 3

141

从Android 开发指南的应用程序基础页面:

默认情况下,应用程序中的所有活动都彼此具有亲和性——也就是说,它们都属于同一个任务。

“singleInstance”活动作为其任务中的唯一活动独立存在。如果它启动另一个活动,则无论其启动模式如何,该活动都将启动到不同的任务中——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。在所有其他方面,“singleInstance”模式与“singleTask”相同。

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

4 个任务中的活动

由于任何一种启动模式都不会有一个以上的 Activity 实例,因此后退按钮将始终将您带到您的情况下的现有 Activity 实例。

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

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

这是一篇很好的博文以获取更多信息,以及图片的功劳:Android 活动和任务系列 - Android 的 UI 组件模型介绍

于 2010-07-10T18:24:00.917 回答
30

以一种简单的方式——

单任务:

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

注意:虽然活动在一个新任务中开始,但“后退”按钮仍将用户返回到上一个活动。

单例-

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

于 2015-04-20T07:23:58.690 回答
4

singleTask并且singleInstance活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例——只有一个这样的任务。
更多android:launchMode

于 2014-04-08T10:22:12.463 回答