You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按下返回键从当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:21:02