Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]

Posted

技术标签:

【中文标题】Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]【英文标题】:Android: How to close one activity on backpress and the entire backstack on another button press? [duplicate] 【发布时间】:2020-03-29 05:10:21 【问题描述】:

我有一个主要活动和文章活动的场景。主活动打开一个文章活动,然后如果您单击文章活动中的相关文章,它会再次打开与请求的相关文章相同的活动。所以基本上你可以在彼此的顶部打开 10 个文章活动,然后在 onBackPress() 上返回每个活动,直到你再次到达主活动。但是客户端还需要一个按钮,它可以让您直接返回主 Activity,而无需再次循环浏览整个 BackStack。

基本上我们有 MA -> AA -> AA -> AA -> (...)。 在 Back Press 上,您应该像 MA 按下全部关闭按钮后,您应该关闭所有 AA 实例并直接返回 MA。

附:我不想失去 MA 的实例。它应该始终作为起点存在于 backstack 中。

我该怎么做?

【问题讨论】:

当你打开下一个 AA 活动时,只需关闭 AA 活动,这意味着你只有 MA->只有 AA @Shane 不,这正是客户不想要的。他希望能够完成每一项 AA 活动。 【参考方案1】:

您可以为您的主要活动创建一个启动函数,并将所需的标志添加到 Intent 以清除堆栈并在您的按钮的 onClick 中调用该函数。此外,为了避免 MainActivity 有多个实例,您应该在清单中设置其午餐模式 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)

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

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 活动中添加(Intent.FLAG_ACTIVITY_CLEAR_TOP 或 Intent.FLAG_ACTIVITY_SINGLE_TOP)标志一样简单。无需在清单中添加任何内容。

【讨论】:

但这不是内存泄漏吗?因为您基本上是在按下 goHomeButton 时再次启动 MainActivity?如果你这样做 10 次,你不会在彼此之上启动 10 个 MainActivity 吗?或者这正是那些标志将阻止的? 不,因为您将 MainActivity 午餐模式设为 singleInstance(在您的清单中,正如我之前提到的),您的活动总是只有一个实例 我会试试这个并给出一些反馈 android:launchMode="singleInstance"【参考方案2】:

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

【讨论】:

以上是关于Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用背景颜色设置圆形按钮并在按下时更改颜色

android在按下搜索按钮@手机时启动用户定义的活动

如何防止活动在按下按钮时加载两次

如何在按下 UIButton 的按钮时关闭按钮阴影?

Android Fragment 在按下后退按钮时未保存 UI 状态

如何在按下按钮时播放音频并在我的手指离开同一个按钮时立即停止?