【问题标题】:How to open already opened activity instead of creating new one?如何打开已经打开的活动而不是创建新活动?
【发布时间】:2017-08-06 03:01:20
【问题描述】:

我有两个带有“导航菜单”的活动,其中包含用于启动 Activity1 和 Activity2 的项目。 例如,我们从 Activity1 启动 Activity2,然后我们希望通过点击“导航菜单”打开 Activity1,但是当我们这样做时,我们会得到 Activity1 的新实例,而不是打开现有的实例。 如果 Activity1 的实例已经存在,我该如何打开它,如果不存在则创建新实例?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    FLAG_ACTIVITY_REORDER_TO_FRONT 添加到与startActivity() 一起使用的Intent

    【讨论】:

    • 但是使用这个,oncreate()方法没有被调用?如果我想用传递给它的新数据刷新活动怎么办? Onresume() 就在那里,但是还有其他方法可以做到吗?
    • @JD.com:onCreate()onNewIntent() 在任何一种情况下都应调用。
    • 未来读者的一些示例代码:Intent intent = new Intent(CurrentActivity.this, ActivityToStart.class); 然后intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);。同样,intent.addFlags(...) 有效,但这取决于您的意图ions:P
    【解决方案2】:

    android:launchMode="singleTop"添加到Manifest.xml中的活动中

    <activity android:name=".myActivity" android:label="@string/app_name"
                android:launchMode="singleTop" />
    

    查看this 了解不同的启动模式 还要注意这一点:

    如上表所示,标准是默认模式,是 适用于大多数类型的活动。 SingleTop也是常见的 以及适用于多种活动的有用启动模式。其他模式—— singleTask 和 singleInstance — 不适合大多数人 应用程序,因为它们产生的交互模型很可能 对用户不熟悉并且与大多数其他人非常不同 应用

    【讨论】:

      【解决方案3】:

      将活动的标志设置为singleTask 并覆盖onNewIntent(Intent intent) 以捕获新意图。

      【讨论】:

        【解决方案4】:

        最完整的答案是使用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 声誉,那就去回答一些真正的问题。

        【讨论】:

        • 我认为这是最好的答案,解释更完整,让我更容易理解......
        猜你喜欢
        • 2019-02-03
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        相关资源
        最近更新 更多