在整个应用中只保留每个活动的一个实例

时间:2016-04-25 12:14:48

标签: android android-activity launchmode

我希望在我的应用程序中启动每个Activity 单个实例 。 launchMode singleTask是一个选项,但它仅适用于一个Activity

我想要

  • 如果没有实例并且被调用,则启动Activity
  • 如果已经存在Activity的任何其他实例 该实例将在不创建新实例的情况下提前 那个Activity
  • 此属性将应用于多个Activity
  • 没有Activity可以保证它始终位于历史堆栈的顶部。

我的工作到现在为止:

我收到了许多对我的案件无效的建议,所以我想指出这些建议,以便没有其他人会提出同样的建议。

  • 我已将launchMode设置为singleTop,这仅在Activity位于历史记录堆栈顶部时才有效。 onNewIntent()仅在Activity位于历史堆栈顶部时才会被调用。在我的情况下,Activity可能位于堆栈中的任何位置。所以这不起作用。

3 个答案:

答案 0 :(得分:9)

启动Activity时,请执行以下操作:

Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

如果此Activity的实例已存在,则会将其移至前端。如果实例不存在,将创建一个新实例。

答案 1 :(得分:3)

您可以将活动的 android:launchMode 设置为 singleTop 在这种情况下,如果活动已经存在,新的意图将它带到前面将被传递到活动的 onNewIntent() http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

如果您的活动位于堆栈顶部,这将有效。

如果您想拥有该活动的单个实例,则可以将 launchMode 设置为 singleTask ,但不建议这样做,因为它会使您的活动驻留在一个单独的任务中,这可能会让用户感到困惑。

答案 2 :(得分:0)

改为使用singleTop启动模式(docs):如果调用者任务中堆栈顶部已存在具有相同类型的Activity实例,则不会创建任何新的Activity,相反,Intent将通过onNewIntent()方法发送到现有的Activity实例。

有关启动模式的详细信息,请参阅this article