Android - Back Stack

2022. 5. 11. 14:24IT/안드로이드

반응형

작업하는 화면의 전 단계로 이동하는 동작이다. 

App을 처음 열면, Android 는 기본 활동이 포함된 새로운 작업을 생성한다. 

Activity 는 Back Stack 이라는 Stack 으로 배열되고, 사용자가 이동한 각각의 새 Activity 는 작업의 back stack 으로 Push된다. 맨 위의 stack 활동은, 현재 사용자가 상호작용하고 있는 활동을 나타내고, 그 아래의 stack 은 백그라운드로 전환되었다가 중지된 활동을 의미한다. 

Back stack 은 뒤로 이동하고자 하는 경우에 유용하다 !

안드로이드는 Stack의 맨 위에 있는 현재 Activity를 삭제하고 폐기 한 뒤에, 그 아래에 있는 활동을 다시 시작할 수 있다. 즉, Stack 에서 활동을 없애고 이전 활동이 Forground로 이동한다. 

사용자가 여러 번 뒤로 이동하고 싶어하는 경우, Android는 맨 마지막 stack 에 가까워질 때 까지 계속 상단에 쌓여있던 활동을 순서대로 없앤다. back stack 에 더 이상 활동이 남아 있지 않으면, 사용자는 기기의 launcher 화면이나 이 활동을 실행한 앱으로 돌아가게 된다. 

백 스택은, 사용자가 열어본 Activity를 추적할 수 있는 것 과 같은 방법으로 Fragment 도 추적할 수 있다. 

1. 기본적으로 navigation 에서 돌아갈 루트를 먼저 설정하고, (화살표로 드래그해 이동 방향 편집)

2. 나 같은 경우에는 cancle 버튼을 각 화면(Fragment)에 추가해 첫 화면(startFragment)로 돌아가도록 설정했다. 

하지만 이렇게 간단하지는 않다 ! 

이렇게만 해놓으면, 시스템 Back 버튼을 누르면 기존 stack 이 사라지지 않고 쌓여있어서 올바르지 않은 동작이다.

위와 같이 StartFragment 에서 시작해서, 주문 App의 마지막 화면인  SummaryFragment까지 갔다가, CANCLE 버튼을 눌러 첫화면으로 돌아갔다면, 

이렇게 이전 stack 들이 폐기된게 아니고 그대로 StartFragment 가 또 쌓여버리는 것이다. 

이 현상을 수정하기 위해서는 , popUpToInclusive 를 사용해 모든 대상을 Backstack 에서 없애보자. 

app:popUpTo="@id/startFragment"  , app:popUpToInclusive="true" 요걸 추가해주자.

이런식으로, 모든 Fragment 에서 시작화면 Fragment 를 popUpTo 에 설정해주고, 

popUpToInclusive 를 true로 수정하자. 

이렇게 수정하고나서, 마지막 화면에 갔다가 CANCLE 을 눌러 첫 화면으로 이동하고, 시스템 Back 버튼을 눌러보자. !

그럼 Back stack 에 더 이상 Fragment 가 남아있지 않아야하므로, App이 종료가 되어야한다. ! 

 

 

## 요약 ##

  • Android에서는 방문한 모든 대상의 백 스택이 유지되며 각각의 새 대상이 스택으로 푸시됩니다.
  • Up 버튼이나 Back 버튼을 탭하면 대상을 백 스택에서 없앨 수 있습니다.
  • Jetpack 탐색 구성요소를 사용하면 프래그먼트 대상을 백 스택으로 푸시하고 백 스택에서 없앨 수 있으므로 기본 Back 버튼 동작을 직접 구현할 필요가 없습니다.
  • 속성 값에 지정된 대상에 이를 때까지 대상을 백 스택에서 없애기 위해 탐색 그래프에서 작업에 app:popUpTo 속성을 지정합니다.
  • app:popUpTo에 지정된 대상도 백 스택에서 없애야 하는 경우 작업에 app:popUpToInclusive="true"를 지정합니다.
  • Intent.ACTION_SEND를 사용하고 Intent.EXTRA_EMAIL, Intent.EXTRA_SUBJECT, Intent.EXTRA_TEXT 등의 인텐트 추가항목을 채워 이메일 앱에 콘텐츠를 공유하도록 암시적 인텐트를 만들 수 있습니다.
  • 수량에 따라 서로 다른 문자열 리소스(예: 단수형 또는 복수형)를 사용하려면 plurals 리소스를 사용합니다.

 

 

728x90
반응형