webView 的canGoBack/goBack 回退栈

使用

Kotlin 复制代码
        // 系统返回键
        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (dwebView?.canGoBack() == true) dwebView?.goBack()
                else {
                    isEnabled = false
                    onBackPressedDispatcher.onBackPressed()
                    isEnabled = true
                }
            }
        })

这样就可以了 ✅

但要实现"真正的回退功能",还需要注意几个关键点:

历史栈构建要点

  1. 必须确保历史栈能正常生成
  2. shouldOverrideUrlLoading 方法中对 http/https 请求要返回 false,否则无法记录历史,导致 canGoBack() 始终为 false
  3. 遇到 target="_blank"window.open 的页面,需要在 WebChromeClient.onCreateWindow 中将新窗口 URL 重定向到当前 WebView,否则不会生成历史记录

返回键处理的优化建议

  • 在 Activity 中,"没有历史"时直接调用 finish() 即可
  • 使用 dispatcher.onBackPressed() 递归处理也可以,但 finish() 更直观

推荐实现代码

kotlin 复制代码
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        val wv = dwebView
        if (wv != null && wv.canGoBack()) {
            wv.goBack()
        } else {
            // Activity 处理
            finish()
            // Fragment 处理
            // findNavController().popBackStack() 或 parentFragmentManager.popBackStack()
        }
    }
})

常见问题排查

  1. 前端是 SPA 应用且使用了 history.replaceState(不增加历史记录)导致回退失效 - 需要与前端协调
  2. 拦截了 http/https 请求并返回 true 自行处理加载 - 历史记录不会增加
  3. 未处理 target="_blank" - 历史记录不增加
  4. 错误页面/重定向导致停留在同一页面(可在 onReceivedError 中跳转自定义错误页并允许后退)

Fragment 使用注意

  • 使用 addCallback(viewLifecycleOwner, ...) 绑定到视图生命周期,防止内存泄漏
  • 没有历史记录时使用 popBackStack(),不要调用 finish()

X5(TBS)内核适配

只需将类名替换为 com.tencent.smtt.sdk.*,逻辑完全一致

总结

基础框架"canGoBack → goBack;否则执行系统返回"的思路是正确的。只需处理好"同页打开链接"和"新窗口重定向到当前页"这两点,回退功能就能稳定工作。

相关推荐
BoomHe10 小时前
Android Framework 文件应用移植到 AndroidStudio
android
传奇开心果编程12 小时前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
>Andre<12 小时前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
事圆则缓13 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
mmsx13 小时前
Android 地图十万要素不卡顿:空间网格 + 渐进式加载的移动端实践
android·大数据·opengl
Godikov15 小时前
Android 工业终端保活实战:前台服务 + 开机自启 + 更新自启的三重保障
android
字节暗面15 小时前
SO加固强度怎么量化?腾讯ACE与FairGuard静态分析实测
android·逆向
终端安全笔记16 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
字节暗面17 小时前
一次游戏安全SO静态分析记录:腾讯ACE与FairGuard加固强度对比
android·逆向工程·游戏加固
传奇开心果编程17 小时前
【Jetpack Compose基础语法学与练】第9课 SideEffect副作用 + LaunchedEffect,处理异步任务和生命周期
android·学习·ui·kotlin·android jetpack