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

OnBackPressedCallback 应用切后台返回后首次点击返回键失效问题

根因分析

  • 应用切后台时,当前Compose组合会触发销毁流程,你的DisposableEffect会执行onDispose回调,调用backCallback.remove()把自定义返回键回调从调度器中移除。
  • 应用切回前台时,Android系统的按键事件分发时序早于Compose重组的执行时机:第一次点击返回键的时候,Compose还没完成重组,DisposableEffect里的addCallback逻辑还没执行,回调还没被注册到调度器,自然不会触发。等第一次返回事件触发了页面重组,回调被重新加上,第二次点击返回就能正常响应了。

解决方案

方案1(推荐):直接用Compose官方提供的BackHandler API

官方实现已经处理了生命周期和回调注册的时序问题,不需要手动管理回调的添加移除,写法更简洁也不会出现上述问题:

BackHandler(true) {
    LocalContext.current.getActivity()?.finish()
}

方案2:修改自定义实现的回调注册逻辑

如果要保留自己的实现,改用带生命周期所有者的addCallback重载,让回调自动和宿主生命周期绑定,就能规避时序问题:

val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(dispatcher, lifecycleOwner) {
    dispatcher?.addCallback(lifecycleOwner, backCallback)
    onDispose {
        backCallback.remove()
    }
}

内容的提问来源于stack exchange,提问作者Barrufet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:15:04