Android: 如何在按下返回按钮时关闭一个活动,并在按下另一个按钮时关闭整个回退堆栈?

15 浏览
0 Comments

Android: 如何在按下返回按钮时关闭一个活动,并在按下另一个按钮时关闭整个回退堆栈?

我有这样一个场景,其中有一个主活动(Main Activity)和一个文章活动(Article Activity)。主活动打开一个文章活动,然后如果你从文章活动中点击相关文章,它会再次打开同一个活动,并显示请求的相关文章。所以基本上你可以在每个文章活动的顶部打开10个文章活动,并通过每个活动的onBackPress()方法逐个返回,直到再次回到主活动。但是客户还希望有一个按钮,可以直接返回到主活动,而无需再次遍历整个返回栈。\n

    \n

  • 基本上我们有MA -> AA -> AA -> AA -> (...)。
  • \n

  • 在按下返回键时,你应该按顺序回退,像MA <- AA <- AA <- AA这样逐个新实例。
  • \n

  • 在按下关闭所有按钮时,你应该关闭所有AA实例,并直接返回到MA。
  • \n

\n附言:我不想失去MA的实例。它应该始终作为起点存在于返回栈中。\n我该如何做到这一点?

0
0 Comments

问题出现的原因:在Android开发中,有时需要在按下返回键时关闭当前活动(Activity),而在按下另一个按钮时关闭整个活动栈(Backstack)。但是,通常情况下,按下返回键只会关闭当前活动,并不会关闭整个活动栈。

解决方法:我们可以通过在意图(Intent)中添加FLAG_ACTIVITY_CLEAR_TOP标志来解决这个问题,以便在按下返回键时关闭当前活动,并在按下另一个按钮时关闭整个活动栈。

具体的解决方法如下所示:

1. 首先,创建一个新的意图(Intent)对象,并将FLAG_ACTIVITY_CLEAR_TOP标志添加到意图中:

Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

2. 接下来,调用startActivity()方法来启动下一个活动(NextActivity):

startActivity(intent);

这样,当按下返回键时,当前活动将被关闭,并且整个活动栈中的其他活动也将被删除。而当按下另一个按钮时,整个活动栈将被关闭。

通过在意图中添加FLAG_ACTIVITY_CLEAR_TOP标志,我们可以实现在按下返回键时关闭当前活动,并在按下另一个按钮时关闭整个活动栈的需求。这种方法非常简单且有效,适用于许多Android应用程序开发场景中。

0
0 Comments

问题的出现原因:在Android应用中,有时我们需要在按下返回按钮时关闭一个活动,并在按下另一个按钮时关闭整个返回栈。这可能是因为我们想要在按下返回按钮时返回上一个界面,并在按下另一个按钮时返回应用的主界面。

解决方法:可以通过添加标志到Intent来清除返回栈,并在按钮点击时调用主活动的函数来实现这个功能。为了避免MainActivity的多个实例,还可以将其启动模式设置为singleInstance或singleTop。对于启动函数,有多种实现方法。

第一种方法:在MainActivity中定义一个静态方法,如下所示。addFlags部分用于在调用MainActivity时清除返回栈,如果不需要可以将其删除。然后在按钮点击监听器中调用该方法。

companion object {

fun startActivity(context: Context) {

val intent = Intent(context, MainActivity::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 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()

}

这些函数的定义并不是必需的,你也可以在按钮的onClick方法中直接创建一个新的Intent实例,但我喜欢这种方式。

更新来自问题提问者:在按钮点击的Intent中,添加(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)标志。无需在清单文件中添加任何内容。但这不会导致内存泄漏吗?因为在按下goHomeButton按钮时,你实际上是再次启动MainActivity。如果你这样做10次,那么不是会在顶部启动10个MainActivity吗?或者这些标志正是用来防止这种情况发生的?

不会,因为你将MainActivity的启动模式设置为singleInstance(如我之前提到的在清单文件中),所以始终只会有一个MainActivity的实例。

我会尝试这样做并给出一些反馈。

android:launchMode="singleInstance"

0