在Android 13及以上版本使用registerOnBackInvokedCallback时,替换super.onBackPressed() 的正确做法是什么?
在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。