SINGLE_TOP, CLEAR_TOP,NEW_TASK로 액티비티 task 관리하기

2020. 12. 13. 14:56android

1. 액티비티 전환 


인텐트(intent)를 통해 액티비티(activity)를 전환하면 기존에 있던 액티비티는 액티비티 스택에 push되고 새로운 화면이 가장 최상단으로 올라와 우리 눈에 보이게 된다. 

 

기존 액티비티를 A라 가정하고 전환할 액티비티를 B라 한다면, A는 왼쪽 그림 1번 처럼 스택에 쌓이고, B가 최상단으로 노출되어, 사용자에게 보일 것이다. 이처럼 A는 메모리상에 적재되어 사라지는 것이 아니라 저장된다. 때문에 뒤로가기 버튼을 눌렀을 경우 2번->3번 과정을 거쳐 다시 A가 최상단으로 노출되어 사용자에게 보여지게 된다.

 

액티비티 스택은 단순히 액티비티를 차곡차곡 쌓는 역할을 하기에 동일한 액티비티가 기존의 스택에 존재하더라도 그대로 쌓이게 된다. 때문에 스택에 대한 관리가 제대로 이뤄지지 않으면 동일한 화면이 몇번이고 나타나는 어색한 구조를 만들게 될 것이다.

 

2. 액티비티 스택 관리 


1. intent 전환을 할 때, flag를 붙여주는 방법

 

2. manifest에서 액티비티의 launchMode를 설정하는 방법

 

두가지 모두 flag들을 설정하는 방식으로 지정할 수 있으나, 인텐트에서 지정할 수 있는 flag만 살펴보겠다.

 

3. 인텐트의 주요 Flag 3가지 


1. FLAG_ACTIVITY_NEW_TASK

-> new_task란, 동일한 affinity를 갖지 않는 액티비티 호출 시, 새로운 task에 액티비티를 push함을 의미한다. 때문에 이전 액티비티가 다른 task에 존재한다면 적절한 핸들링이 필요하다. 기본적으로는 동일한 affinity를 갖고 있다. 따라서 affinity가 동일한 task에서 호출된 액티비티가 task에 존재하지 않거나, 이미 존재하더라도 새로운 인스턴스를 만들어서 액티비티 스택에 push한다. 즉 동일한 affinity에서는 중복된 액티비티가 push될 수 있다. 

 

2. FLAG_ACTIVITY_SINGLE_TOP

-> single top이란, 액티비티 스택에서 최상단에 있는 액티비티와 전환 될 액티비티가 같을 때, 새로운 인스턴스(인텐트)를 생성하지 않고, 스택에 있던 액티비티의 인텐트를 통해 액티비티를 재사용하는 것을 의미한다. 즉, 액티비티를 재사용하는 것이기 때문에, onCreate()콜백부터 실행되는 것이 아니라 onNewIntent(Intent intent)콜백을 통해, 기존 액티비티의 intent정보를 받아 onResume() 콜백으로 호출된다.

Activity Stack

해당 플래그를 처음 사용할 때 헷갈리던 것은 현재 눈에 보이는 화면은 액티비티 스택에 쌓이지 않았다고 생각했던 것이다. 즉, 현재 눈에 보이는 액티비티는 이미 액티비티 스택에 적재된 상태이면서, 가장 최상단에 있는 상태(눈에 보이는 상태)이다.

 

3. FLAG_ACTIVITY_CLEAR_TOP

-> clear top이란, 현재 불러올 액티비티가 B인데, 이미 스택에 존재한다면, B를 포함한 모든 액티비티들을 pop해버리고 새로 호출한 B 액티비티를 stack 최상단으로 지정하는 것을 의미한다. 

 

Activity Stack

새롭게 인스턴스를 생성하는 것이기 때문에 새 intent를 갖는 액티비티를 생성하게 된다. 그렇기 때문에

라이프사이클도 onCreate() -> onResume()로 호출이 된다. 반대로 호출하려는 액티비티가 스택에 없다면, 기본적인 intent 동작을 하게된다.