Android

Android API 33대응! onBackPressed()는 deprecated 된다

seokzoo 2022. 10. 23. 21:38
반응형

onBackPressed() is deprecated

안드로이드 13(API Level 33)부터 onBackPressed()가 deprecated 된다는 사실 알고 계셨나요?
targetSdk와 compileSdk를 33으로 올리면 아래와 같이 확인하실 수 있습니다.


우리의 뒤로가기를 책임져주었던 onBackPressed() 왜 deprecated가 되는지 알아보고, 어떻게 변경해볼지도 알아봅시다.

why deprecated

먼저 deprecated된 이유에 대해서 알아볼텐데요, 안드로이드 10(API Level 29)부터 제스처 탐색 기능을 지원하는데요, 이는 iOS와 동일하게 왼쪽에서 오른쪽으로 스와이프시에 뒤로가기를 실행해주는 기능입니다.

그런데 이러한 기능은 recyclerview에서 horizontal로 넘기거나, viewPager와 같이 좌우(즉, 수평)로 스와이프하는 경우에도 뒤로가기 기능이 함께 수행될 수 있습니다. 즉, 안드로이드 OS에서 사용자가 뒤로 가기를 하고싶은건지, swipe를 수행하고 싶은건지 구별할 수 없다는 뜻입니다.

이러한 이유때문에 해결책으로 제시된 것이 바로 onBackPressedDispatcher 입니다.

onBackPressedDispatcher

지금 이시간부터 안드로이드의 backpress는 onBackPressedDispatcher로 통일합니다.(내맘임)

사용법은 간단합니다!

  1. object로 callback 함수를 통해 뒤로가기시에 실행해줄 함수를 구현해줍니다.
    private val onBackPressedCallback = object : OnBackPressedCallback(true) {
         override fun handleOnBackPressed() {
             Log.d("tjrwn", "handleOnBackPressed: 새로운거 실행")
         }
     }
  2. 해당 callback을 BackPressedDispatcher에 등록해준다.
    override fun onCreate(savedInstanceState: Bundle?) {
         ...
         onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
    }
    여기서 this는 lifecycleOwner를 전달해줍니다.

끝입니다! 정말 쉽죠~ 다만 주의해야할 점이 있습니다. MainActivity에서 override fun onBackPressed()를 만들고 super.onBackPressed()를 지운다면, 위의 콜백 함수가 실행되지 않으니 주의해야합니다.

Advantages of onBackPressedDispatcher

또한 onBackPressedCallback의 장점이자, 알아두어야할 점이 있는데, OnBackPressedCallback의 인자로 준 true는 enable한지 아닌지의 속성입니다. false로 줄경우 시스템의 기본 뒤로가기를 수행합니다.

이처럼 변수 isEnabled를 통해 커스텀 백키의 활성화를 컨트롤 할 수 있으니, 좀더 자유롭게 사용할 수 있게 됩니다.


또한 onBackPressed가 없는 Fragment에서의 Custom BackPress 또한 구현해줄 수 있습니다.
자세한 사항은 요기를 읽어주세요~

이제부터는 Fragment에서도 사용할 수 있고, 이제 Deprecated되어 사용할 수 없는 onBackPressed() 보다는 onBackPressedDispatcher를 사용해야겠네요!! 물론 나부터~~

end of page

다시 문제로 돌아가서, 우리는 안드로이드 OS에게 뒤로가기를 수행할지, 스와이프중인지에 대해서 구분을 해주어야합니다.
그래서 제가 이해한 바로는 스와이프중일때는 Dispatcher의 callback의 enable을 아래와 같이 true 바꾸어 시스템의 뒤로가기를 가로채서 뒤로가기를 막거나 다른 어떠한 일을 수행할 수 있게끔 해야합니다.

onBackPressedCallback.isEnabled = true

그리고 스와이프가 아닐 경우에는 다시 false로 만들어 시스템의 back key를 수행해주도록 만들면 되겠지요!
이전의 onBackPressed는 항상 수행됐기 때문에 이러한 기능을 활용할 수 없었습니다.

하지만 이제는 가능해지겠죠?

제 글에서 틀린 내용이 있다면 댓글 달아주세요!

참고

https://oguzhanaslann.medium.com/onbackpressed-deprecated-so-what-to-use-92ddd55fc21d
https://onlyfor-me-blog.tistory.com/522
https://wooyoung-tom.medium.com/android-fragment-%EC%97%90%EC%84%9C%EC%9D%98-backpress-%EB%8F%99%EC%9E%91-%EC%A0%9C%EC%96%B4-6e17173cb72e
https://developer.android.com/guide/navigation/navigation-custom-back?hl=ko
https://developer.android.com/about/versions/12/behavior-changes-all?hl=ko#activity-lifecycle
구글 번역 ^^

반응형