Android中如何实现非Launcher Activity按返回键退出应用
解决XTInitActivity按返回键直接退出应用的问题
方案一:启动XTInitActivity时清理任务栈
修改Launcher Activity中SplashFragment里启动XTInitActivity的代码,给Intent添加标记,将XTInitActivity设为新任务栈的根,同时清除原有栈中的Launcher Activity:
fun initListeners() { val DURATION = 2500 user_app.toString() val handler = Handler() handler.postDelayed({ if (user_app.isEmpty() && pwd_app.isEmpty()) { navigationToLogin() } else { Toast.makeText(safeActivity, "Sesión iniciada ${OPERATOR_APP.getPreferenceToString().toString()}", Toast.LENGTH_SHORT).show() // 修改启动逻辑,添加任务栈清理标记 val intent = Intent(safeActivity, XTInitActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) // 可选:关闭当前Launcher Activity(因flags已清栈,此步可省略) safeActivity.finish() } }, DURATION.toLong()) }
修改后XTInitActivity会成为任务栈的唯一根Activity,按下返回键时直接退出应用,不会回到Launcher Activity。
方案二:在XTInitActivity中拦截返回键事件(适配最新API)
由于onBackPressed()已被废弃,推荐使用OnBackPressedDispatcher处理返回逻辑。结合XTInitActivity中的导航Fragment,可判断当前是否处于导航首页,再决定退出应用还是返回上一个Fragment:
class XTInitActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_xt_init) // 替换为你实际的导航容器ID val navController = findNavController(R.id.nav_host_fragment_xt_init) // 添加返回键回调 onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // 判断是否处于导航栈起始页 if (navController.currentDestination?.id == navController.graph.startDestinationId) { // 清除整个任务栈并退出应用 finishAndRemoveTask() } else { // 正常返回上一个Fragment navController.popBackStack() } } }) } }
finishAndRemoveTask()会关闭当前Activity并移除整个任务栈,是符合Android规范的退出方式。- 回调参数
true表示默认启用拦截,会覆盖系统默认的返回键行为。
内容的提问来源于stack exchange,提问作者Alexis Vilchis
相关产品推荐
相关产品推荐

