【问题标题】:android activity order, want only one instance of current activity, instead of clearing stackandroid活动顺序,只需要当前活动的一个实例,而不是清除堆栈
【发布时间】:2014-05-02 15:34:54
【问题描述】:

singleTask 和 singleInstance 本身不是答案。

我在堆栈中有活动... n, n+1, n+2

n+2中的元素可以打开n+1

这会创建堆栈

... n, n+1, n+2, n+1

我希望它创建堆栈

... n, n+2, n+1,其中n+1被移到栈顶

singleTask 创建这个堆栈

... n, n+1

singleInstance 创建这个堆栈

n+1 之前的所有活动都已关闭。

我都不想要。

我可以使用任何启动模式吗?

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 只是使该活动不会从头开始再次加载,但不会清除历史记录中的重复活动,也许我可以使用标志的组合?或者我可以在活动堆栈的索引中找到该活动,如果它不是最近的活动,则将其删除?

【问题讨论】:

    标签: android android-activity single-instance launchmode


    【解决方案1】:

    我认为你应该使用 FLAG_ACTIVITY_REORDER_TO_FRONT。

    如果在传递给 Context.startActivity() 的 Intent 中设置,则如果已启动的 Activity 已经在运行,则该标志将导致已启动的 Activity 被带到其任务历史堆栈的前面。 例如,考虑一个由四个活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 的 Intent 解析为活动 B 的组件,则 B 将被带到历史堆栈的前面,结果顺序为:A、C、D、B。如果还指定了 FLAG_ACTIVITY_CLEAR_TOP,则此标志将被忽略。

    【讨论】:

    • 是的,这很奇怪。在此示例中,我的活动 A 因某种原因被终止
    • 删除 reorder_to_front 让我的所有活动保持活力。
    【解决方案2】:

    您应该将 FLAG_ACTIVITY_REORDER_TO_FRONT 添加到您的意图中。如果没有该标志,您的方案将创建如下堆栈:(启动 Activity A,A 启动 B,然后 B 再次启动 A)

    TaskRecord{41ab0370 #23 A com.example.testproject U 0}
      Run #7: ActivityRecord{41c655a8 u0 com.example.testproject/.MainActivity}
      Run #6: ActivityRecord{41d378d0 u0 com.example.testproject/.SecondActivity}
      Run #5: ActivityRecord{41bf99b8 u0 com.example.testproject/.MainActivity}
    

    但是使用标志,没有任何特定的启动模式,您将获得以下堆栈,我认为这是您需要的:

    TaskRecord{41d8a838 #25 A com.example.testproject U 0}
      Run #6: ActivityRecord{41d89590 u0 com.example.testproject/.MainActivity}
      Run #5: ActivityRecord{41c52b80 u0 com.example.testproject/.SecondActivity}
    

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2018-12-01
      • 1970-01-01
      • 2012-09-19
      • 2011-09-19
      相关资源
      最近更新 更多