오늘도 더 나은 코드를 작성하였습니까?

Navigation and the back stack(네비게이션과 백 스택) 본문

Android Jetpack Architecture/Navigation

Navigation and the back stack(네비게이션과 백 스택)

hik14 2021. 11. 19. 16:57

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과 연결된 상태를 자동으로 복원할 수도 있습니다.