Develop/Android + Kotlin

[Android] 안드로이드 태스크(Task), launchMode, 인텐트 플래그(IntentFlag)

마크투비 2021. 8. 25. 01:14

1. 안드로이드 Task란?

👉 Task는 어플리케이션에서 실행되는 액티비티를 보관하고 관리하며 Stack 형태의 연속된 Activity로 이루어진다.

 

- 선입후출(FILO)의 형태로 나중에 쌓인 액티비티일수록 가장 먼저 사용된다(햄버거)

- 서로 다른 어플리케이션 간의 이동에도 Task를 이용해 사용자 경험(UX)를 유지시켜 준다
- 최초적재 액티비티는 Root Activity라고 하며 어플리케이션 런처로부터 시작된다
- 마지막으로 적재되는 액티비티는 Top Activity라고 하며 현재 화면에 활성화되어 있는 액티비티를 말한다
- Task 내에는 서로 다른 어플리케이션의 액티비티들이 포함될 수 있어 어플리케이션에 경계없이 하나의 어플리케이션인 것처럼 보이게 해준다

- Task의 Stack내에 존재하는 액티비티들은 모두 묶여서 background와 foreground로 함께 이동한다

- Flag를 사용하여 Task내 액티비티의 흐름을 제어할 수 있다

 

안드로이드 시스템은 자동으로 태스크를 관리하지만, 런치 모드를 통해 액티비티가 태스크에 관리되는 방식을 설정할 수 있다. 런치모드는 AndroidManifest.xml이나 인텐트의 플래그를 통해 설정할 수 있다.

 

켜지는 방법을 자체 속성으로 가지고 있는 경우 ➡ launchMode

켜지는 방법을 지시하는 경우 ➡ IntentFlag

 

2. launchMode

설정할 수 있는 모드는 standard, singleTop, singleTask, singleInstance로 4가지가 존재한다.

두가지로 분류할 수 있는데 standard와 singleTop은 액티비티가 여러번 인스턴스화 될 수 있고(singleTop의 경우 조건부), 태스크에 어떤 곳에도 존재할 수 있다. singleTask와 singleInstance는 단일 인스턴스를 유지하면서 항상 태스크의 루트에 있다.

 

모드 설명 다중 허용
standard (기본 설정) 기본적으로 설정되어 있는 모드이다.
시스템이 항상 대상 작업에 새 액티비티 인스턴스를 생성하고 인텐트를 해당 인스턴스로 라우팅합니다.
O
singleTop 액티비티의 인스턴스가 이미 대상 작업의 맨 위에 존재하는 경우 시스템은 새 액티비티 인스턴스를 생성하는 대신 onNewIntent() 메서드를 호출하여 인텐트를 해당 인스턴스로 라우팅한다. 조건부
singleTask 시스템이 새 작업의 루트에 액티비티를 생성하고 인텐트를 해당 액티비티로 라우팅한다.
그러나 액티비티 인스턴스가 이미 존재하는 경우 시스템은 새 인스턴스를 생성하는 대신 
onNewIntent() 메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅한다.
X
singleInstance singleTask와 동일하게 새로운 태스크를 생성한다. singleTask와는 다르게 해당 태스크에서 다른 액티비티를 허용하지 않는다. (다른 액티비티 호출 불가) X

 

3. 인텐트 플래그 IntentFlag

인텐트에 플래그를 포함해서 태스크 관리 방식을 설정할 수 있는데, 매니페스트와 동시에 설정할 경우 플래그가 더 우선순위가 높다.

 

FLAG_ACTIVITY_NEW_TASK

새로운 태스크를 생성해서 저장. singleTask와 동일

 

FLAG_ACTIVITY_SINGLE_TOP

태스크 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일

 

FLAG_ACTIVITY_CLEAR_TOP

액티비티가 태스크에 존재한다면, 그 액티비티 위쪽에 존재하는 모든 액티비티를 제거하고 해당 액티비티를 활성화한다.

 

 

 

 

Reference

https://developer.android.com/guide/topics/manifest/activity-element?hl=ko#lmode 

https://arabiannight.tistory.com/153