【发布时间】:2017-08-06 03:01:20
【问题描述】:
我有两个带有“导航菜单”的活动,其中包含用于启动 Activity1 和 Activity2 的项目。 例如,我们从 Activity1 启动 Activity2,然后我们希望通过点击“导航菜单”打开 Activity1,但是当我们这样做时,我们会得到 Activity1 的新实例,而不是打开现有的实例。 如果 Activity1 的实例已经存在,我该如何打开它,如果不存在则创建新实例?
【问题讨论】:
我有两个带有“导航菜单”的活动,其中包含用于启动 Activity1 和 Activity2 的项目。 例如,我们从 Activity1 启动 Activity2,然后我们希望通过点击“导航菜单”打开 Activity1,但是当我们这样做时,我们会得到 Activity1 的新实例,而不是打开现有的实例。 如果 Activity1 的实例已经存在,我该如何打开它,如果不存在则创建新实例?
【问题讨论】:
将FLAG_ACTIVITY_REORDER_TO_FRONT 添加到与startActivity() 一起使用的Intent。
【讨论】:
onCreate() 或 onNewIntent() 在任何一种情况下都应调用。
Intent intent = new Intent(CurrentActivity.this, ActivityToStart.class); 然后intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);。同样,intent.addFlags(...) 有效,但这取决于您的意图ions:P
将android:launchMode="singleTop"添加到Manifest.xml中的活动中
<activity android:name=".myActivity" android:label="@string/app_name"
android:launchMode="singleTop" />
查看this 了解不同的启动模式 还要注意这一点:
如上表所示,标准是默认模式,是 适用于大多数类型的活动。 SingleTop也是常见的 以及适用于多种活动的有用启动模式。其他模式—— singleTask 和 singleInstance — 不适合大多数人 应用程序,因为它们产生的交互模型很可能 对用户不熟悉并且与大多数其他人非常不同 应用
【讨论】:
将活动的标志设置为singleTask 并覆盖onNewIntent(Intent intent) 以捕获新意图。
【讨论】:
最完整的答案是使用android:launchMode="singleTask",并根据您的功能覆盖onNewIntent,因为如果已经存在Activity 的实例并将新的Intent 传递给它,它将被调用。
<activity
android:name=".MainActivity"
android:launchMode="singleTask"/>
为什么?
基于问题。 有两个活动,Activity1 & Activity2
我们打开 Activity1,然后从 Activity1 打开 Activity2。然后,在 Activity2 内部:
如果 Activity1 的实例已经存在,我该如何打开它,如果不存在则创建新实例?
如AndroidManifestActivity_launchMode 中所述,singleTask
如果在启动 Activity 时,已经有一个任务在运行,该任务以此 Activity 开始,那么当前任务不会启动一个新实例,而是被带到前面。现有实例将收到对 Activity.onNewIntent() 的调用...
此外,在 Intent 类下,如果您阅读了有关 singleTask launchMode 的信息,它已经使用了 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT 并且手动为其设置 Intent 通常不会由应用程序代码设置。
如FLAG_ACTIVITY_BROUGHT_TO_FRONT中所述
int FLAG_ACTIVITY_BROUGHT_TO_FRONT 此标志通常不是由应用程序代码设置,而是由系统为您设置,如 singleTask 模式的 launchMode 文档中所述。
因此,通过使用singleTask launchMode,您可以确保您的应用程序只有一个实例,并且您不必在每个调用您的Activity2的活动中将FLAG_ACTIVITY_BROUGHT_TO_FRONT标志添加到您的意图中> 按照CommonsWare 的建议。
现在,如果我们按照weakwire 的建议使用android:launchMode="singleTop",那么他为自己提供的link 会明确说明;
"singleTop"...在其他情况下——例如,如果“singleTop”活动的现有实例在目标任务中,但不在堆栈顶部,或者它在堆栈顶部,但不在目标任务中——将创建一个新实例并将其推送到堆栈中。
换句话说,在某些情况下,我们最终会得到多个 Activity1 实例,这是我们不想要的。
最后说,如果您是喜欢编辑答案的人之一,而这些答案对答案本身没有任何贡献,那么如果您真的想提高您的 Stack Overflow 声誉,那就去回答一些真正的问题。
【讨论】: