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。
- 基本上我们有 MA -> AA -> AA -> AA -> (...)。
- 按后退键,您应该像 MA <- AA <- AA <- AA 这样按顺序返回到每个新实例。
- 按下“全部关闭”按钮时,您应该关闭所有 AA 实例并直接返回 MA。
P.S。我不想失去 MA 的实例。它应该始终作为起点在后台堆栈中。
我该怎么做?
您应该使用 FLAG_ACTIVITY_CLEAR_TOP
标志调用意图以删除堆栈中的所有其他活动
您可以为您的主 activity 创建一个启动函数,并向 Intent 添加所需的标志以清除返回堆栈,并在按钮的 onClick 中调用该函数。也为了避免有多个 MainActivity 实例,你应该在你的 manifest.for 启动函数中设置它的午餐模式 singleInstance 或 singleTop 你有多个实现方式。
第一种方式: 在你的 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)标志一样简单。无需在清单中添加任何内容。
我有这样一个场景,我有一个 Main Activity 和一个 Article Activity。 Main Activity 打开文章 Activity,然后如果您单击文章 Activity 中的相关文章,它会再次打开与请求的相关文章相同的 activity。所以基本上你可以打开 10 个文章活动,然后在 onBackPress() 中返回每一个,直到你再次到达 Main Activity。但是客户端还需要一个按钮,该按钮可以将您直接送回 Main Activity,而无需再次循环遍历整个 BackStack。
- 基本上我们有 MA -> AA -> AA -> AA -> (...)。
- 按后退键,您应该像 MA <- AA <- AA <- AA 这样按顺序返回到每个新实例。
- 按下“全部关闭”按钮时,您应该关闭所有 AA 实例并直接返回 MA。
P.S。我不想失去 MA 的实例。它应该始终作为起点在后台堆栈中。
我该怎么做?
您应该使用 FLAG_ACTIVITY_CLEAR_TOP
标志调用意图以删除堆栈中的所有其他活动
您可以为您的主 activity 创建一个启动函数,并向 Intent 添加所需的标志以清除返回堆栈,并在按钮的 onClick 中调用该函数。也为了避免有多个 MainActivity 实例,你应该在你的 manifest.for 启动函数中设置它的午餐模式 singleInstance 或 singleTop 你有多个实现方式。
第一种方式: 在你的 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)标志一样简单。无需在清单中添加任何内容。