Navigation and the back stack(네비게이션과 백 스택)
Android는 방문한 destination이 포함된 백 스택을 유지 관리합니다
앱의 첫 번째 destination은 사용자가 앱을 열 때 스택에 배치됩니다. navigation() 메서드를 호출할 때마다 스택의 맨 위에 다른 destination이 배치됩니다.
Up 또는 Back(system)를 누르면 각각 NavController.navigateUp() 및 NavController.popBackStack() 메서드를 호출하여 스택에서 맨 위 대상을 제거(또는 팝)한다
NavController.popBackStack()은 성공적으로 다른 destination으로 팝백되었는지 여부를 나타내는 boolean value를 반환합니다.
false를 반환하는 가장 흔한 경우는 그래프의 시작 destination 을 수동(코드로)으로 팝할 때입니다
opBackStack()가 false를 반환하면
NavController.getCurrentDestination()이 null을 반환합니다.
Activity에서 finish()를 호출하여 새 destination으로 이동하거나 팝을 처리할 책임이 있습니다.
if (!navController.popBackStack()) {
// Call finish() on your Activity
finish()
}
Dialog destination 은 백 스택
다른 destination을 오버레이함을 나타내는 FloatingWindow 인터페이스를 구현합니다.
따라서 하나 이상의 FloatingWindow destination은 탐색 백 스택의 맨 위에만 존재할 수 있습니다.
FloatingWindow를 구현하지 않는 destination으로 이동하면 모든 FloatingWindow destination이 스택 맨 위에서 자동으로 pop off 됩니다. 이렇게 하면 현재 destination이 백 스택의 다른 destination상 위에 항상 표시됩니다.
FloatingWindow destination은 탐색 백 스택의 맨 위에만 존재
FloatingWindow destination은 위에 다른 FloatingWindow destination 존재 가능
non -FloatingWindow destination 으로 이동시 위에 2개의 FloatingWindow destination를 자동으로 pop처리 하고 이동한다.
popUpTo and popUpToInclusive
action 을 사용하여 탐색할 때 option으로 백 스택에서 추가적으로 destination을 pop 할 수 있습니다.
예를 들어 앱에 초기 로그인 흐름이 있는 경우 사용자가 로그인하면 뒤로 버튼이 사용자를 로그인 흐름으로 다시 데려가지 않도록 모든 로그인 관련 대상을 백 스택에서 제거해야 합니다.
destination에서 다른 destination으로 이동할 때 현재 destination을 팝업하려면 연결된 <action> 요소에 app:popUpTo 속성을 추가. app:popUpTo는 navigation() 호출의 일부로 백 스택에서 일부 destination을 팝하도록 Navigation 라이브러리에 지시합니다.
속성 값은 스택에 남아 있어야 하는 가장 최근 destination의 ID입니다.
app:popUpToInclusive="true"를 포함하여 app:popUpTo에 지정된 destination이 백 스택에서도 제거되어야 함을 나타낼 수 있습니다.
각 navigation action을 통해 이동하면 destination이 백 스택에 추가됩니다.
이 흐름을 반복적으로 탐색하는 경우 백 스택에는 각 destination(A, B, C, A, B, C, A 등)의 여러 세트가 포함됩니다.
이러한 반복을 방지하려면
destination C에서 destination A로 이동하는 작업에서 app:popUpTo 및 app:popUpToInclusive를 지정해야한다.
C에 도착했을때 back stack (A B C)순으로 쌓여있다.
destination A로 다시 이동할 때,
popUpTo A로 이동하는데, 이는 탐색하는 동안 스택에서 B와 C를 제거
A - B - C ->(B,C 제거) A
app:popUpToInclusive="true"를 사용하면 스택에서 첫 번째 A를 팝하여 효과적으로 지움
(A(첫번째 A제거)- A)
(A)
* app:popUpToInclusive를 사용하지 않으면 백 스택에 대상 A의 두 인스턴스가 포함되어 있다.
popUpToSaveState and restoreSaveState
app:popUpTo를 사용하여 destination으로 이동할 때 Navigation 2.4.0-alpha01 이상을 사용하면 백 스택에서 꺼낸 모든 destination의 상태를 선택적으로 저장할 수 있습니다.
app:popUpToSaveState="true" 설정한다.
app:restoreSaveState="true"를 포함하여
app:destination에 설정된 destination과 연결된 상태를 자동으로 복원할 수도 있습니다.