본문 바로가기
ⓢⓣⓤⓓⓨ/ⓐⓝⓓⓡⓞⓘⓓⓢⓣⓤⓓⓘⓞ

[Kotlin] 백 스택

by heaven00 2021. 11. 7.
728x90

 

 

 

솝트에서 첫번째 과제와 두번째 세미나 내용에서 백스택에 대해서 생각해볼 수 있는 시간을 가졌다.

이때동안 코딩을 하면서 백스택에 대해서 한번도 생각해본적이 없었고, 중요한 점인 것도 깨닫지 못했다.

하지만 이번 기회를 통해 백스택이 얼마나 중요한지 깨닫게 되었기에! 제대로 정리해보고자 쓰는 글

 

 


 

 

* 스택이란?

한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료 구조

 - 후입선출 (LIFO : Last-In First-Out) 방식 먼저 들어 온 것이 아래에 있으므로 나중에 들어온 것이 먼저 사용 또는 제거되는 특징을 가짐. (반대 개념 FIFO : First-In First-Out

 - Push 함수 : 스택에 값을 넣을 때(제일 상단에 값을 추가/삽입 함)

 - Pop 함수 : 스택에서 값을 꺼낼 때(제일 상단의 값을 추출/삭제)

위의 그림과 같이 상자가 쌓이는 형식으로, 나중에 들어온 것이 먼저 사용되는 것.

 

 

1. 백 스택

작업은 사용자가 특정 작업을 할 때 상호작용하는 활동의 컬렉션이고, 활동은 백 스택에 각 활동이 열린 순서대로 정렬된다.

사용자가 어떠한 활동을 하면, 새로운 활동은 백 스택에 추가된다.

사용자가 뒤로 버튼을 누르면 새로운 활동이 완료되고 스택에서 팝된다.

 

ex) 새 메시지의 목록을 보여주는 액티비티 하나를 가지는 이메일 앱

사용자가 메시지를 선택하면 해당 메시지를 보여주는 새 액티비티가 실행되고 백스택에 PUSH 된다.

사용자가 뒤로가기 버튼을 누르면 방금 열린 액티비티가 종료되고 스택에서 POP 된다.

 

 => 즉, 액티비티들은 실행된 순서대로 스택에 차곡차곡 쌓이는데, 이 때 이 스택을 백스택이라고 함

 

 

2. 백 스택 과정

 

 

1. 현재 활동이 또 다른 활동을 시작하면 새 활동이 스택의 맨 위에 푸시되고 포커스를 가짐. 이전 활동은 스택에 남아있지만 중지된다. 활동이 중지되면 시스템은 활동의 사용자 인터페이스가 갖고 있는 현재 상태를 보존한다.

2. 사용자가 뒤로 버튼을 누르면 현재 활동이 스택의 맨 위에서 팝되고(활동이 제거되고) 이전 활동이 다시 시작된다.(UI의 이전 상태가 복원됨). 

 

=> 사용자가 계속 뒤로 버튼을 누르면 사용자가 홈 화면으로 돌아갈 때까지 스택의 각 활동이 스택에서 팝되어 바로 이전 활동이 나타난다. 모든 활동이 스택에서 삭제되면 작업이 더 이상 존재하지 않는다.

 

 

3. 앱 활동 및 작업의 기본 동작

 

하나으 액티비티가 여러 번 인스턴스화 가능

 

활동 A가 활동 B를 시작하면 활동 A는 중지되지만 시스템이 상태(예: 스크롤 위치 및 양식에 입력된 텍스트)를 보존한다. 사용자가 활동 B에 있는 동안 뒤로 버튼을 누르면 활동 A가 다시 시작되며 상태도 복원된다.

 

사용자가 홈 버튼을 눌러 작업을 떠나면 현재 활동이 중지되고 작업이 백그라운드로 전환됩니다. 시스템은 작업의 모든 활동 상태를 보존한다. 사용자가 나중에 작업을 시작했던 런처 아이콘을 선택하여 작업을 다시 시작하면 작업이 포그라운드로 나오고 스택의 맨 위에 있는 활동이 다시 시작된다.

 

사용자가 뒤로 버튼을 누르면 현재 활동이 스택에서 팝되고 제거된다. 스택의 이전 활동이 다시 시작된다. 활동이 제거되면 시스템은 활동 상태를 보존하지 않는다.

 

활동은 여러 번 인스턴스화될 수 있으며 심지어 다른 작업으로부터도 인스턴스화될 수 있다.

 

 

4. 작업 관리

위와 같은 액티비티 작업들은 인텐트 플래그와 manifest 내에 flag를 통해서 다르게 사용가능.

 

 taskAffinity : 해당 액티비티가 쌓일 임의로 백 스택(=Task)를 지정할 수 있다. (singleTask나 singleInstance가 설정되어 있어야 함.)

 

 launchMode : 시작 모드를 정의

=> standard : default 설정으로, 여러개의 인스턴스 생성이 가능.

=> singleTop : 여러개의 인스턴스 생성이 가능하지만, 호출한 액티비티가 최상위 액티비티로 있는 경우에는 인스턴스 생성없이 기존의 액티비티로 대체.

=> singleTask : 한 번에 액티비티 인스턴스 한 개씩만 존재 가능.

=> singleInstance : singleTask와 동일합니다. 단, 인스턴스가 있는 작업에 대해 시스템이 어떤 액티비티도 시작하지 않은 경우에는 예외, 이것으로 시작한 액티비티는 모두 별개의 작업에서 열림.

 

 allowTaskReparenting : true로 설정이 되면 taskAffinity에 설정되어 있는 작업이 나타나면 그쪽으로 작업이 옮겨짐.

 

clearTaskOnLaunch : true로 설정이 되면 사용자가 작업을 떠났다가 다시 돌아올 경우 루트 액티비티까지 스택을 지움.

 

alwaysRetainTaskState : true로 설정이 되면 사용자가 오랜 시 작업을 떠나 있어도 스택에 있는 모든 액티비티를 유지.

 

finishOnTaskLaunch : 전반적으로 clearTaskOnLaunch와 같지만 작업 전체가 아니라 하나의 액티비티에서 동작.

 

 

 

4. 실행 모드 정의

실행 모드를 통해 활동의 새 인스턴스가 현재 작업과 연결되는 방식을 정의 가능.

☝ manifest 파일 사용

: manifest 파일에서 활동을 선언하면 활동이 시작될 때 작업과 연결되어야 하는 방식을 지정 가능

 

✌ 인텐트 플래그 사용

: startActivity를 호출할 때 새 활동이 현재 작업과 연결되어야 하는 방식(또는 연결되어야 하는지 여부)을 선언하는 플래그를 Intent에 포함할 수 있다.

 

=> 활동 A가 활동 B를 시작하면 활동 B는 현재 작업과 연결되어야 하는 방식(연결되어야 한다면)을 manifest에 정의할 수 있으며 활동 A도 활동 B가 현재 작업과 연결되어야 하는 방식을 요청할 수 있다. 두 활동이 모두 활동 B가 작업과 연결되어야 하는 방식을 정의하면 활동 A의 요청(인텐트에 정의)이 활동 B의 요청(manifest에 정의)보다 우선한다.

 

 

 

4. 백 스택 삭제

사용자가 오랜 시간 동안 작업을 떠나있으면 시스템은 루트 활동을 제외한 모든 활동을 작업에서 삭제한다. 사용자가 작업으로 다시 돌아오면 루트 활동만 복원된다. 시스템이 이런 방식으로 동작하는 이유는 오랜 시간이 지나면 사용자가 이전에 하고 있던 일을 그만두고 작업으로 돌아왔을 때 새로운 일을 시작할 가능성이 크기 때문이다.

 

✅ alwaysRetainTaskState 

: 작업의 루트 활동에서 이 속성을 "true"로 설정하면 방금 설명한 기본 동작이 일어나지 않음. 작업은 오랜 시간이 지난 후에도 스택의 모든 활동을 유지.

 

clearTaskOnLaunch

:작업의 루트 활동에서 이 속성을 "true"로 설정하면 사용자가 작업을 떠났다가 작업으로 다시 돌아올 때마다 스택이 루트 활동까지 삭제됨. 다시 말해서 alwaysRetainTaskState와 정반대임. 사용자는 항상 작업의 초기 상태로 돌아오게 되며 이는 아주 잠깐만 작업을 떠났다가 돌아와도 마찬가지.

 

finishOnTaskLaunch 

: 이 속성은 clearTaskOnLaunch와 비슷하지만 작업 전체가 아니라 단일 활동에서 작동한다. 또한 이 속성을 사용하면 루트 활동을 포함하여 어떤 활동이라도 지울 수 있다. 이 속성을 "true"로 설정하면 활동은 현재 세션에 대해서만 작업의 일부로 유지된다. 사용자가 작업을 떠났다가 다시 돌아오면 이 작업은 더 이상 존재하지 않는다.

 

 


 

안드로이드 스튜디오 공식 문서를 참고하여 쓴 글 입니다.

사실 제대로 이해는 안되지만 이번 기회에 정리는 된 것 같다!

 

 

728x90

'ⓢⓣⓤⓓⓨ > ⓐⓝⓓⓡⓞⓘⓓⓢⓣⓤⓓⓘⓞ' 카테고리의 다른 글

[Android] MVVM 패턴  (3) 2022.01.27
[Kotlin] Retrofit2  (0) 2021.11.14
[Kotlin] BottomNavigation  (0) 2021.10.31
[Kotlin] ViewPager (뷰 페이저)  (0) 2021.10.24
[Kotlin] 프래그먼트(Fragment)  (0) 2021.10.16

댓글