【问题标题】:How to manage activity stack?如何管理活动堆栈?
【发布时间】:2011-09-16 05:29:50
【问题描述】:

当我的堆栈处于这种情况时:

A->B->C

如果我启动 D 活动,我希望活动堆栈变成:

A->D

请注意,活动 C 是一个对话框。

【问题讨论】:

    标签: android android-activity stack


    【解决方案1】:

    以下是所需的步骤:

    • 从活动 C 启动活动 A,该活动 A 带有一个布尔值 fromActivityC,与意图和标志 FLAG_ACTIVITY_CLEAR_TOP 捆绑在一起。
    • 现在在创建活动 A 时首先检查此布尔值“fromActivityC”,如果存在则启动活动 D,否则正常流程继续。

      // following code can be used to get the boolean in the oncreate
      boolean entrypoint=this.getIntent().getExtras().getBoolean("fromActivityC");
      

    一个小解决方法,但希望它有所帮助

    【讨论】:

    • 谢谢,有趣的技巧,它运行了......但是在键盘上打字我有一个想法:当A调用B时,完成A;当B返回时,重新创建A;当 C 调用 D 时,使用 FLAG_ACTIVITY_CLEAR_TOP 创建 D。是的!
    • 是的,应该可以工作..但你不认为每次都重新创建这样的活动会花费大量的 cpu 周期,并且违背了活动堆栈的目的......需要考虑的事情:)跨度>
    【解决方案2】:

    有几种方法可以从堆栈中删除一个活动或防止它被堆栈:

    要从堆栈中删除您的活动,只需调用finish(),请参阅here

    您还可以在清单中实现属性:android:noHistory="true",以防止 Activity 被堆叠。

    更多详情请参阅此问题表:Removing an activity from the history stack

    【讨论】:

      【解决方案3】:

      有点hacky,但您可以在清除堆栈的同时启动活动A,然后启动活动D。

      Activity A可能在消失之前出现片刻

      【讨论】:

        【解决方案4】:

        您可以尝试在启动 ActivityC 时完成 ActivityB 并在启动 A 时完成 ActivityC

        您的代码如下所示:

        Intent i = new Intent(this.class.ActivityC);
        startActivity(i);
        ActivityB.finish();
        

        【讨论】:

        • 我不能,活动 C 是一个对话框。如果我在开始 C 时完成 B,我会在 C 下看到 A。
        【解决方案5】:

        在回调 C 时,将消息传回 A 并从 Acall finish 开始您的 D,这将完成 B 和 C(因为 C 是 B 的一部分)。

        【讨论】:

          【解决方案6】:

          这里有一个更好的解决方案,不依赖于评估A 中的Intent 内容: 使用标志FLAG_ACTIVITY_TASK_ON_HOME

          您还应该看看其他标志Android Intent

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-02
            • 2019-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-04
            • 1970-01-01
            • 2011-07-15
            相关资源
            最近更新 更多