如何打开已打开的活动而不是创建新活动?

时间:2011-09-03 14:48:26

标签: android android-activity

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

4 个答案:

答案 0 :(得分:31)

FLAG_ACTIVITY_REORDER_TO_FRONT添加到您使用Intent的{​​{1}}。

答案 1 :(得分:5)

android:launchMode="singleTop"

中为您的活动添加Manifest.xml
<activity android:name=".myActivity" android:label="@string/app_name"
            android:launchMode="singleTop" />

检查this了解不同的launchModes 还要记住这个:

  

如上表所示,标准是默认模式,而且是   适合大多数类型的活动。 SingleTop也很常见   适用于许多类型活动的有用启动模式。其他模式 -   singleTask和singleInstance - 不适合大多数人   应用程序,因为它们可能导致交互模型   对用户不熟悉,与其他大多数人截然不同   应用

答案 2 :(得分:2)

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

答案 3 :(得分:1)

最完整的答案是使用android:launchMode="singleTask"并根据您的功能覆盖onNewIntent,因为如果已经有Activity的实例具有新的意图,则会调用它传递给它。

<activity
            android:name=".MainActivity"
            android:launchMode="singleTask"/>

为什么?

基于这个问题。 有两项活动,活动1 &amp;的活性2

我们打开 Activity1 ,然后从 Activity1 打开 Activity2 。然后,在 Activity2

  

我如何打开 Activity1 的实例(如果已存在)并创建新实例?

正如AndroidManifestActivity_launchMode singleTask

中所述
  

如果在启动活动时,已经有一个以此活动开始的任务正在运行,那么当前任务将被带到前面而不是启动新实例。现有实例将使用...

接收对Activity.onNewIntent()的调用

此外,在intent类下,如果您读到它已使用singleTask launchMode的{​​{1}},并且通常不会通过应用程序代码手动设置意图。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

中所述
  

int FLAG_ACTIVITY_BROUGHT_TO_FRONT   此标志通常不是由应用程序代码设置的,而是由系统为您设置的,如singleTask模式的launchMode文档中所述。

因此,使用Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT,您确保只有一个应用程序实例,并且您不必在每个调用的活动中向您的意图添加singleTask launchMode标记活动2 ,如CommonsWare所示。

现在,如果我们使用FLAG_ACTIVITY_BROUGHT_TO_FRONT作为weakwire建议,link他提供了自己明确说明的内容;

  

“singleTop”...在其他情况下 - 例如,如果“singleTop”活动的现有实例在目标任务中,但不在堆栈顶部,或者它位于堆栈顶部,但不在目标任务中 - 将创建一个新实例并将其推送到堆栈中。

换句话说,在某些情况下我们最终会遇到多个 Activity1 的实例,这是我们不想要的。

最后要说的是,如果你喜欢编辑那些对答案本身没什么贡献的答案,那么如果你真的想提高Stack Overflow的声誉,请回答一些真正的问题。