启动新活动并清除除家庭活动外的先前活动

Posted

技术标签:

【中文标题】启动新活动并清除除家庭活动外的先前活动【英文标题】: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 就会被移除。

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

【问题讨论】:

【参考方案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 项活动想要结束,但我还是这样做了:

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

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

【讨论】:

以上是关于启动新活动并清除除家庭活动外的先前活动的主要内容,如果未能解决你的问题,请参考以下文章

如何清除从 Android 中点击通知打开的先前活动?

清除 android 活动堆栈开始一个新活动

java Android调用新活动并清除所有其他活动。

清除 Activity Stack 并在 android 中启动新的 Activity

如何重启活动并清除玩家状态?

Android:绝对清除活动