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
'Develop > Android + Kotlin' 카테고리의 다른 글
[Android] 안드로이드 Kotiln의 NullSafety (0) | 2021.08.25 |
---|---|
[Android] 안드로이드 프래그먼트(fragment) (0) | 2021.08.25 |
[Android] Xml 가져오기, 뷰(View)를 activity로 가져오는 방법 (0) | 2021.08.25 |
[Android] 안드로이드 Activity 액티비티 클래스와 Intent 인텐트 (0) | 2021.08.25 |
앱 개발의 시작 - 개발자의 의사소통/다양한 개발 직군들 (0) | 2021.07.27 |