如何按下返回键从当前Activity关闭应用且不退回上一Activity
解决方案
出现该问题的核心原因是SplashScreen对应的Activity默认会被加入应用的Activity回退栈,当你在WebView页按下返回键时,系统会按照回退栈顺序回退到上一个未销毁的SplashActivity,而非直接退出应用,可通过以下两种方案解决:
方案1:启动WebView Activity时配置Intent标识
在SplashActivity中启动WebView所在Activity时,添加FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK标识,直接清空原有回退栈,将WebView Activity设为新的栈根元素,这是适配性最高的通用方案。
Kotlin示例代码:
val intent = Intent(this, WebViewActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) // 销毁SplashActivity本身,避免残留 finish()
Java示例代码:
Intent intent = new Intent(this, WebViewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish();
方案2:重写WebView Activity的返回键逻辑
如果业务场景需要保留SplashActivity在栈中,可以直接在WebView所在Activity中重写返回键响应逻辑,按下返回时直接关闭当前任务栈,不执行默认回退逻辑:
Kotlin示例代码:
override fun onBackPressed() { // 优先处理WebView内部页面回退,不需要可以去掉该判断 if (webView.canGoBack()) { webView.goBack() } else { // 直接关闭当前应用所有关联Activity,退出应用 finishAffinity() } }
Java示例代码:
@Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { finishAffinity(); } }
提示:如果你的应用targetSdkVersion >= 33,更推荐使用
OnBackPressedCallback实现回退逻辑,系统兼容性更好。
注意事项
- 启动WebView Activity后必须调用
finish()销毁SplashActivity,否则即使加了启动标识也可能出现页面残留问题 - 若WebView需要支持内部历史页面回退,必须优先判断
webView.canGoBack(),再执行退出逻辑,避免影响WebView的正常使用
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

