일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 코드포스
- android
- architecture
- Kotlin
- relay
- activity
- ProGuard
- Coroutine
- pandas
- textfield
- AWS
- 코루틴
- 프로그래머스
- MiTweet
- Python
- Codeforces
- livedata
- androidStudio
- boj
- 암호학
- 백준
- Gradle
- Compose
- Rxjava
- Hilt
- MyVoca
- 쿠링
- TEST
- GitHub
- Coroutines
- Today
- Total
이동식 저장소
[Android Fundametals] Activity - 7. Custom back navigation 본문
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``를 통해 콜백을 등록한다.
참고자료
'Primary > Android' 카테고리의 다른 글
[Android Fundamentals] Activity - 9. Parcelables and bundles (0) | 2024.08.07 |
---|---|
[Android Fundamentals] Activity - 8. 프로세스와 앱 생명주기 (0) | 2024.08.07 |
[Android Fundamentals] Activity - 6. Tasks and the back stack (0) | 2024.07.23 |
Macrobenchmark로 프레임 성능 측정하기 (0) | 2024.07.21 |
[Android Fundamentals] Activity - 5. Activity test (0) | 2024.07.19 |