【问题标题】:How to avoid multiple instances of same Activity without using singleInstance or singleTask launchMode?如何在不使用 singleInstance 或 singleTask launchMode 的情况下避免同一 Activity 的多个实例?
【发布时间】:2015-01-08 13:49:46
【问题描述】:

这是我正在寻找的行为:

启动应用程序并导航 => 活动 A > B > C 然后我按 Home 按钮并再次打开应用程序 => 回到 C(使用堆栈 A B C)

现在我有一个正在运行的服务来创建通知。 单击通知 => 清除堆栈中的所有内容并从 onNewIntent() 打开 A 然后打开 X(堆栈现在是 A > X)

但是当我点击通知时的当前行为是 A B C A X(X 在顶部)

据我了解,这是因为上下文错误。有关空白上下文问题的更多信息,请参阅以下帖子https://stackoverflow.com/a/24999724

所以我的结论是使用“标准”启动模式并找到一种方法来在单击通知时从所有活动中清除堆栈。是否有任何模式可以实现以获得这种行为?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    这与“错误的上下文”无关。如果您想单击Notification 以清除任务堆栈并启动ActivityA 的新实例,则在您放入NotificationIntent 中使用以下标志:

    Intent.FLAG_ACTIVIY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
    

    假设ActivityA仍然处于活动状态(未完成)并且在任务栈的根,他会将任务栈清空回ActivityA(包括清空ActivityA的现有实例),然后创建一个ActivityA 的新实例并调用 onCreate() 等。

    如果您想重用ActivityA 的现有实例,您可以改用它:

    Intent.FLAG_ACTIVIY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
    

    假设ActivityA仍处于活动状态(未完成)并且位于任务堆栈的根部,他会将任务堆栈清除回ActivityA无需清除@的现有实例987654335@),然后在 ActivityA 的现有实例上调用 onNewIntent()

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多