在Android 13及以上版本使用registerOnBackInvokedCallback时,替换super.onBackPressed() 的正确做法是什么?

移动开发 2026-07-09

在Android 13+上使用 registerOnBackInvokedCallback 时,替换 super.onBackPressed() 的正确方法是什么?

我正在更新我的Activity以支持Android 13+,其中 onBackPressed() 已被弃用。

之前我有:

@Override
public void onBackPressed() {
    dontStopMusicOnPause = true;
    super.onBackPressed();
}

现在我在使用 registerOnBackInvokedCallback

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
        OnBackInvokedDispatcher.PRIORITY_DEFAULT,
        () -> {
            dontStopMusicOnPause = true;
            getOnBackPressedDispatcher().onBackPressed(); // is this correct?
        }
    );
}

我不确定在Android 13回调中调用 getOnBackPressedDispatcher().onBackPressed() 是否有效,还是应该调用 finish() 或其他什么来模仿 super.onBackPressed() 的行为。

解决方案

正确的方法是使用AndroidX的 OnBackPressedCallback。切勿调用 super.onBackPressed()——它已被弃用,在较新的API上可能会造成重复触发。

声明回调

private val onBackPressedCallback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        // your logic here

        dontStopMusicOnPause = true;
        // to fall through to default back behavior:
        isEnabled = false
        activity?.onBackPressedDispatcher?.onBackPressed()
    }
}

在onAttach、onViewCreated或 onCreate中注册它

activity?.onBackPressedDispatcher?.addCallback(
    viewLifecycleOwner, // or 'this' if in Activity
    onBackPressedCallback
)

并且不需要取消注册或移除,因为它是按生命周期感知的,但通常我在onStart时将enabled(isEnabled = true) 设置为true,在onStop时将enabled(isEnabled = false) 设置为false,不过这并非必需(只是我的习惯)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章