Android:如何在按下按钮时关闭一个 activity 并在按下另一个按钮时关闭整个堆栈?

Android: How to close one activity on backpress and the entire backstack on another button press?

我有这样一个场景,我有一个 Main Activity 和一个 Article Activity。 Main Activity 打开文章 Activity,然后如果您单击文章 Activity 中的相关文章,它会再次打开与请求的相关文章相同的 activity。所以基本上你可以打开 10 个文章活动,然后在 onBackPress() 中返回每一个,直到你再次到达 Main Activity。但是客户端还需要一个按钮,该按钮可以将您直接送回 Main Activity,而无需再次循环遍历整个 BackStack。

P.S。我不想失去 MA 的实例。它应该始终作为起点在后台堆栈中。

我该怎么做?

您应该使用 FLAG_ACTIVITY_CLEAR_TOP 标志调用意图以删除堆栈中的所有其他活动

您可以为您的主 activity 创建一个启动函数,并向 Intent 添加所需的标志以清除返回堆栈,并在按钮的 onClick 中调用该函数。也为了避免有多个 MainActivity 实例,你应该在你的 manifest.for 启动函数中设置它的午餐​​模式 singleInstancesingleTop 你有多个实现方式。

第一种方式: 在你的 MainActivity 中定义一个静态方法,像这样 addFlags 部分是在调用 MainActivity 时清除返回堆栈,如果不需要你可以删除它

companion object {
        @JvmStatic
        fun startActivity(context: Context) {
            val intent = Intent(context, KYCActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or 
                     Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
            }
            context.startActivity(intent)
        }
    }

您可以在按钮点击侦听器中调用它

gotoHomeButton.setOnClickListener {
    MainActivity.startActivity(context)
}

第二种方式: 定义一个启动活动的扩展函数

inline fun <reified T: Activity> Context.startActivity() {
    startActivity(Intent(this, T::class.java).apply {
        addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or 
             Intent.FLAG_ACTIVITY_NEW_TASK)
    })
}

然后像这样调用函数

gotoHomeButton.setOnClickListener {
    startActivity<MainActivity>()
}

没有必要定义这些函数,您可以在按钮 onClick 中创建一个新的 Intent 实例,但我喜欢这种方式。

OP 更新

这显然就像在按钮单击的 Intent 上向 AA activity 添加(Intent.FLAG_ACTIVITY_CLEAR_TOP 或 Intent.FLAG_ACTIVITY_SINGLE_TOP)标志一样简单。无需在清单中添加任何内容。