[Android] navigation backstack

Lety (TaeJin Kang)
4 min readJun 5, 2019

--

Pop Behavior

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

--

--