API 35与API 36中Android返回键行为差异问题
API 35与API 36中Android返回键行为差异问题
老哥,太懂你这种老代码突然“罢工”的憋屈了!用了好几年的返回键逻辑,升级到API 36就出问题,搁谁都得挠头。先帮你把没写完的代码补全(应该是这样吧?):
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { webView.goBack() return true } // 如果不是返回键或者WebView无法返回,交给系统默认处理 return super.onKeyDown(keyCode, event) }
为啥API 36里这逻辑不好使了?其实从Android 13(API 33)开始,系统就对返回键的处理逻辑做了调整,到API 36(Android 14)更是强化了预测式返回手势的优先级,老的onKeyDown方法处理返回键的优先级被降低了,甚至可能被系统的新机制拦截。
给你两个靠谱的解决方案:
方案一:迁移到官方推荐的OnBackPressedCallback(强烈推荐)
这是API 30之后官方主推的返回键处理方式,能完美适配新系统的返回手势,不会被拦截。代码示例:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_layout) // 初始化你的WebView val webView = findViewById<WebView>(R.id.webView) // ...其他WebView配置 // 创建返回键回调 val backCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (webView.canGoBack()) { // WebView有历史记录时返回上一页 webView.goBack() } else { // 没有历史记录时,触发系统默认返回行为 isEnabled = false onBackPressedDispatcher.onBackPressed() isEnabled = true } } } // 将回调添加到返回键分发器 onBackPressedDispatcher.addCallback(this, backCallback) }方案二:继续用onKeyDown的兼容处理
如果暂时不想大改代码,可以检查下你的Manifest配置:如果在Activity标签里设置了android:enableOnBackInvokedCallback="true"(API 33+默认开启),这个属性会让系统优先处理返回事件,导致onKeyDown接不到返回键信号。你可以尝试暂时关闭这个属性,但不推荐长期这么做,毕竟这是系统的新特性,用户体验会更好。
总之,还是建议尽快迁移到OnBackPressedCallback,不仅能解决当前的问题,还能适配后续Android版本的更新,避免再踩类似的坑。
备注:内容来源于stack exchange,提问作者GenAndroidDev
相关产品推荐
相关产品推荐

