如何关闭除首个Activity外的所有Android历史Activity?
实现方案
针对你描述的Activity跳转栈场景,有两种常用的实现方案,其中第一种侵入性最低,不需要修改原有其他页面的逻辑:
方案1:重写TransferConfirmationActivity返回逻辑(推荐)
该方案完全保留进入转账确认页之前的正常返回逻辑,仅在确认页触发返回时清理中间栈回到主页:
- 重写确认页的返回回调,跳转主页时添加Intent Flag清理上层栈:
- Kotlin 兼容实现(适配Android 13及以上版本):
import android.content.Intent import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity class TransferConfirmationActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 注册高版本系统返回回调 onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { backToHome() } }) } // 兼容低版本系统返回逻辑 @Deprecated("Deprecated in Java") override fun onBackPressed() { backToHome() } private fun backToHome() { val homeIntent = Intent(this, HomeActivity::class.java).apply { // 两个Flag配合:清理HomeActivity上方所有Activity、复用已存在的主页实例 flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP } startActivity(homeIntent) // 销毁当前确认页 finish() } }
- Java 兼容实现:
import android.content.Intent; import android.os.Bundle; import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.AppCompatActivity; public class TransferConfirmationActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { backToHome(); } }); } @Deprecated("Deprecated in Java") @Override public void onBackPressed() { backToHome(); } private void backToHome() { Intent homeIntent = new Intent(this, HomeActivity.class); homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(homeIntent); finish(); } }
用到的两个Flag作用说明:
FLAG_ACTIVITY_CLEAR_TOP:查找当前任务栈中已存在的HomeActivity实例,销毁该实例上方的所有中间ActivityFLAG_ACTIVITY_SINGLE_TOP:复用已有的HomeActivity实例,不会重新创建主页,保留用户之前在主页的操作状态
方案2:启动确认页时重构返回栈(可选)
如果你的业务允许用户进入转账确认页后,不需要再返回之前的转账页面核对信息,可以用该方案,启动确认页时直接清理中间栈:
在TransferReviewActivity的跳转逻辑中添加如下代码:
val confirmIntent = Intent(this, TransferConfirmationActivity::class.java) val stackBuilder = TaskStackBuilder.create(this) // 保留主页作为栈底 stackBuilder.addNextIntent(Intent(this, HomeActivity::class.java)) stackBuilder.addNextIntent(confirmIntent) stackBuilder.startActivities() // 销毁当前页及之前所有中间转账页面 finishAffinity()
注意:该方案会导致进入确认页后,无法再返回之前的转账输入页面,需根据业务需求选择。
内容的提问来源于stack exchange,提问作者anta40
相关产品推荐
相关产品推荐

