이동식 저장소

[Android Fundametals] Activity - 7. Custom back navigation 본문

Primary/Android

[Android Fundametals] Activity - 7. Custom back navigation

해스끼 2024. 8. 5. 16:17

Back navigation은 사용자가 이전에 봤던 화면으로 돌아가는 방법을 말한다.

 

안드로이드는 사용자가 지금까지 봤던 화면들을 back stack으로 관리한다. Back stack에 저장된 각 항목은 destination이라고 부른다. 스택의 LIFO 특성을 활용하면 가장 최근에 봤던 화면부터 하나씩 다시 볼 수 있다. 

 

일반적인 경우에는 스택에서 pop하는 기본 로직만으로 충분하지만, 가끔 커스텀 로직이 필요할 때가 있다. 예를 들어 ``WebView``를 보여줄 때에는 뒤로 가기를 눌렀을 때 이전 웹 페이지로 돌아가는 커스텀 로직이 필요하다. 

 

Android 13 이상에서는 predictive back 제스쳐가 존재한다. Predictive back 내용은 나중에 따로 알아보자.

커스텀 back 로직 구현

``ComponentActivity``를 사용하면 ``OnBackPressedDispatcher``를 활용하여 뒤로 가기 작업을 정의할 수 있다.

 

``OnBackPressedDispatcher``는 뒤로 가기 이벤트를 1개 이상의 ``OnBackPressedCallback`` 객체에 분배하는 역할을 한다. 각 콜백은 enable 또는 disable될 수 있다. 콜백이 활성화되어 있다면 dispatcher가 콜백의 ``handleOnBackPressed()``을 실행하여 뒤로 가기 이벤트를 처리한다.

 

콜백은 ``OnBackPressedDispatcher.addCallback(LifecycleOwner, OnBackPressedCallback)`` 함수를 통해 등록할 수 있다.  이 함수를 사용하면 생명주기에 따라 콜백을 자동으로 등록/삭제할 수 있다. 이 함수를 호출했다고 해서 콜백이 바로 등록되는 것은 아니고, 생명주기 state가 최소 ``started``여야 등록된다. 

 

생명주기가 ``destroyed``가 되면 콜백이 자동으로 삭제된다. 물론 그 전에 수동으로 삭제할 수도 있다. 

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback is only called when MyFragment is at least started
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // 뒤로 가기 로직
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

여러 개의 콜백을 등록했을 때에는 enable된 콜백 중 가장 최근에 등록된 콜백 하나만 실행된다. 즉 한 번의 이벤트를 통해 여러 개의 콜백이 실행되지는 않는다.

 

모든 콜백을 삭제하고 싶다면 ``OnBackPressesdDispatcher.remove()``를 실행하면 된다.

onBackPressed?

사실 ``ComponentActivity``에는 ``onBackPressed()``라는 함수도 있다. 사용자가 뒤로 가기 버튼을 눌렀을 때 실행되는 함수이다. 그런데 Android 13(API 33)부터 deprecated되었고, 이 글에서 소개한 ``OnBackPressedDispatcher``를 사용하는 것이 권장된다. 

 

Deprecated된 이유는, Activity 콜백이라는 특성상 하위 fragment에서 자체적인 뒤로 가기 로직을 구현하는 데 어려움이 있었기 때문이다. 

 

Compose에는 ``BackHandler``라는 대체재도 있다. ``BackHandler``도 내부적으로 ``OnBackPressedDispatcher``를 통해 콜백을 등록한다.

참고자료

 

맞춤형 뒤로 탐색 기능 제공  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 맞춤형 뒤로 탐색 기능 제공 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뒤로 탐색 기능은 사용자

developer.android.com

Comments