【问题标题】:Keep only one instance of each activity in entire app在整个应用程序中只保留每个活动的一个实例
【发布时间】:2016-04-25 12:14:47
【问题描述】:

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

我想要

  • 如果没有实例并调用它,则启动Activity
  • 如果该Activity 的任何其他实例已经存在,那么 该实例将被带到前面而不创建新实例 其中Activity
  • 此属性将应用于多个Activity
  • 没有Activity 确实保证它始终位于历史堆栈的顶部。

到目前为止我的工作:

我收到了许多对我的案例无效的建议,所以我想指出这些,以免其他人给出相同的建议。

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

【问题讨论】:

  • 在每个活动中使用 singleTop

标签: android android-activity launchmode


【解决方案1】:

当你启动 Activity 时,这样做:

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

如果这个Activity 的实例已经存在,那么它将被移到前面。如果实例不存在,则会创建一个新实例。

【讨论】:

  • @David Wasser:对我来说同样的问题。解决了我的问题,干杯!
【解决方案2】:

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

如果您的活动位于堆栈顶部,这将起作用。

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

【讨论】:

  • 我假设活动必须在历史堆栈的顶部才能在您的给定条件下工作。而我的情况并非如此。如果我错了,请纠正我@Mina。
  • 是的,你是对的,它必须在栈顶
  • 但我的情况不同。请查看已编辑的问题。
【解决方案3】:

改用singleTop启动模式(docs):如果调用者Task的栈顶已经有一个同类型的Activity实例,就不会再创建新的Activity,而是一个Intent通过 onNewIntent() 方法发送到已存在的 Activity 实例。

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

【讨论】:

  • 会试一试。并让您知道。
  • 所以我假设活动必须在历史堆栈的顶部才能在您的给定条件下工作。而我的情况并非如此。如果我错了,请纠正我@Marcin。
  • 好的,我的问题略有不同。实际上@david-wasser 使用FLAG_ACTIVITY_REORDER_TO_FRONT 的回答很好,我赞成他的
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多