[Android] navigation backstack
androidx에 포함된 navigation을 이용하면 백 스택을 효과적으로 관리할 수 있다. 백 스택을 관리하기 위해서 액션에 popUpTo와 popUpToInclusive 옵션을 사용한다.
기본적인 원칙은 아래 4가지다.
1.액션의 popUpTo 속성은 주어진 도착점(destination)이 나올 때까지 백 스택을 팝업한다.
2. popUpToInclusive 속성이 false이거나 설정되지 않은 경우, popUpTo 는 지정된 도착점까지 모든 도착점들을 제거한다. 하지만 지정된 목적지는 백 스택에 들어있다.
3. popUpToInclusive 속성이 true인 경우, popUpTo 속성은 주어진 목적지를 포함해서 모든 목적지들을 백 스택에서 제거한다.
4. popUpToInclusive 속성이 true이고 popUpTo가 앱의 시작점으로 설정된 경우, action은 백 스택의 모든 도착점을 제거한다. 백 버튼을 누르면 바로 앱을 종료한다.
간단한 규칙이다. 하지만 네비게이션 그래프가 순환 그래프가 되면 약간 혼란스러워진다. 몇 가지 실험을 해보자.
git : https://gitlab.com/taej0127/navigationtestfinal
A → B, C
B → C, D
C → D
D → A
이렇게 6개의 액션이 있다.
상황 1
진행 : A →B →D →A →C →D
C→D 액션에 popUpTo를 BlankFragment2로 지정하고
D에서 백 버튼을 누르면 어떻게 될까?
상황 2
진행 : A →C →D →A →C →D
백 스택이 있기 때문에 C에서 백 버튼을 누르면 A로 돌아간다. C가 B에서 왔는지 A에 왔는지를 백 스택으로 확인할 수 있다.
C→D 액션에 popUpTo를 BlankFragment2로 지정하고
D에서 백 버튼을 누르면 어떻게 될까?
상황 3
진행 : A →B →D →A →B →D
B →D 액션에 popUpTo를 BlankFragment로 지정하고
마지막 D에서 백 버튼을 누르면 어떻게 될까?
상황 4
진행 : A →B →D →A →B →D
B →D 액션에 popUpTo를 BlankFragment로 지정하고
popUpToInclusive를 true로 한 상태에서,
마지막 D에서 백 버튼을 누르면 어떻게 될까?
해답
상황 1의 경우
B로 돌아간다. (A → B)
이 상태에서 두 번 백 버튼을 누르면 종료된다.
상황 2의 경우
백 스택에 BlankFragment2가 들어있지 않기 때문에 그냥 popUpTo 옵션이 지정되어 있지 않은 상황과 같이 동작한다. 바로 전 C로 돌아간다.
상황 3의 경우
화면은 A로 바뀐다. 이 A는 A →B →D →A 의 마지막 A이다.
여기서 백 버튼을 누르면 D로 돌아가고, (A →B →D)
또 백 버튼을 누르면 B가 아니라 A로 돌아가는데 이것은 B →D 액션의 popUpTo가 BlankFragment로 지정되어 있기 때문이다.
또 백 버튼을 누르면 종료된다.
상황 4의 경우
원칙 4에 의해서 백 스택에 모든 도착점들이 사라진다. 화면은 그대로 D를 나타내고 있고, 이 상태에서 백 버튼을 누르면 앱이 종료된다.
참고 : https://developer.android.com/guide/navigation/navigation-getting-started