【问题标题】:Launch new activity and clear previous activities except home activity启动新活动并清除除家庭活动外的先前活动
【发布时间】:2016-02-02 23:09:24
【问题描述】:

我在下面启动了一系列活动:

首页活动->第二个活动->第三个活动->第四个活动

我想要实现的是,当第 3 个活动启动第 4 个活动时,它会从后台堆栈中清除活动 2 和 3。因此,单击第 4 个活动返回到主活动

即用户应该仍然可以从第 3 个活动返回到第 2 个,但是一旦第 4 个活动启动,活动 2 和 3 就会被移除。

实现这一点的配置是什么?

【问题讨论】:

    标签: android android-intent android-activity android-task


    【解决方案1】:

    听起来你想CLEAR_TOP

    试试这个:

    Intent i = new Intent(this, HomeActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    

    【讨论】:

    • 谢谢.. 你是说,我应该覆盖后退按钮,以便它使用此配置调用启动活动?
    • 是的,假设该屏幕的后退按钮的目标。
    【解决方案2】:

    您可以在第二个和第三个活动中注册BroadCastReceiver,该活动在其onReceive() 实现中具有finish()

    在启动 4th Activity 时触发广播。

    如果它正常工作,将相同的广播实现移动到BaseClass 并添加一个布尔检查来注册广播与否。

    如果你正在使用片段,你可以尝试

    getFragmentManager().popBackStack("tag_of_fragment_to_pop", 0);

    【讨论】:

    • 我想这会起作用,但听起来有点“hacky”想知道是否有一些配置可以与意图标志一起使用。
    • 据我记忆,i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);仅当您在清除所有中间活动并可能调用 onNewIntent() 的第三个活动之后再次启动第一个活动时才有效。我使用 Broadast 接收器方法来实现完美运行的“注销”。
    【解决方案3】:

    我认为最简单的方法是使用这样的东西:

    Intent homeActivityIntent = new Intent(fourth.this,
                            home.class);
    homeActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    homeActivityIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(homeActivityIntent);
    

    【讨论】:

    • 谢谢.. 你是说,我应该覆盖后退按钮,以便它使用此配置调用启动活动?
    • 是的,如果这是用户返回活动 1 的唯一途径。
    【解决方案4】:

    尽管所有答案都很有用,而且我只有 2 项活动想要结束,但我还是这样做了:

    1. startActivityForResult() 活动 2
    2. 在 Activity 3 上成功启动 Activity 4 后,我在 Activity 3 上调用 finish() 之前设置了 RESULT_OK
    3. 在 Activity 2 中,我在 onActivityResult() 处理成功结果,这样我知道 Activity 4 已经启动,所以我可以完成 Activity 2。

    因此,Activity 2 和 3 在启动 Activity 4 时都关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多