如何关闭除第一个之外的所有以前的 Android 活动?

Posted

技术标签:

【中文标题】如何关闭除第一个之外的所有以前的 Android 活动?【英文标题】:How to close all previous Android actvitities except the first one? 【发布时间】:2021-12-12 13:37:23 【问题描述】:

考虑一个假设的电子银行应用程序,其流程如下:

HomeActivity -> CurrencyConverterActivity -> PickContactActivity -> InputDataTransferActivity -> TransferReviewActivity -> TransferConfirmationActivity

所有活动(HomeActivity 除外)都使用通常的startActivity() 调用,而没有finish()。 这是有意的,因此用户可以查看前一个屏幕上的输入。但是一旦你到达 TransferConfirmationActivity 并按回,我想回到 HomeActivity(其他活动被杀死)。

如何做到这一点?

【问题讨论】:

使用 startActivityForResult() 启动所有活动。在 TransferConfirmationActivity 中,将 putExtra 添加到您用于 finish() 的意图中,表明接收活动也必须关闭。 【参考方案1】:

我认为您可以使用Intent.FLAG_ACTIVITY_CLEAR_TOP 标志来实现这一点。

android Documentation约FLAG_ACTIVITY_CLEAR_TOP

如果设置,并且正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,除此之外的所有其他活动都将关闭,并且 此 Intent 将作为 新意图。

val intent = Intent(this, HomeActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)

【讨论】:

【参考方案2】:

启动 HomeActivity 并在 Intent 中添加标志

Intent intent = new Intent(activity, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

【讨论】:

【参考方案3】:

TransferConfirmationActivity 中覆盖onBackPressed() 并返回到HomeActivity,如下所示:

Intent intent = new Intent(this, TransferConfirmationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();

这会将用户返回到HomeActivity 的现有实例,同时从堆栈中删除所有其他活动。

如果您希望创建 HomeActivity 的新实例并返回到该实例,只需删除标志 Intent.FLAG_ACTIVITY_SINGLE_TOP

【讨论】:

以上是关于如何关闭除第一个之外的所有以前的 Android 活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除除第一个之外的所有 URL 哈希?

选择除第一个之外的所有“tr”

如何清除霓虹灯中除第一个非零车道之外的所有车道?

选择除第一个之外的所有子元素

jQuery删除除第一行之外的所有表行

Jquery 删除一个下拉菜单中除第一个option之外的所有option