[안드로이드] Task 와 LaunchMode

Task (태스크)

태스크란 특정 작업을 수행할 때, 사용자와 상호작용하는 액티비티의 모음이다.

하나의 태스크 안에 여러개의 액티비티들이 쌓일 수 있다.

스택형태로, 1->2->3 순으로 액티비티가 들어갔다면 3->2->1 순서대로 나온다! (LIFO)

실행 모드

실행 모드를 이용하여 액티비티의 새 인스턴스가 현재 작업과 연결되는 방식을 정의할 수 있다.

매니페스트 파일과 인텐트를 사용하여 2가지 방법으로 실행 모드를 정의할 수 있다.

매니페스트 파일 사용

액티비티를 선언할 때 activity요소의 launchMode 속성을 사용하여 방식을 지정할 수 있다.

launchMode에 할당할 수 있는 4가지 실행모드는 다음과 같습니다.

#### standard (기본 모드)

기본 값으로, 시스템은 액티비티가 시작된 태스크에 새로운 액티비티 인스턴스를 생성하여 넣고,

인텐트로 인스턴스를 라우팅한다. 액티비티는 여러 번 인스턴스화 될 수 있고, 각 인스턴스는 서로 다른 태스크에

속할 수 있으며, 한 태스크에는 여러 인스턴스가 있을 수 있다.

ABCD 인 상태에서 D 액티비티 인텐트가 도착하면 ABCDD 가 된다.

#### singleTop

액티비티의 인스턴스가 이미 현재 백스택의 맨 위에 있으면, 시스템은 액티비티의 새 인스턴스를 생성하지 않고

onNewIntent()메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅한다.

ABCD 가 있는 상태에서 D 액티비티의 인텐트가 도착하면 ABCD 유지한다.

#### singleTask

시스템이 새 태스크를 생성하고 생성된 태스크에 액티비티를 인스턴스화한다.

그러나 액티비티의 인스턴스가 이미 별도의 태스크에 있다면 새 인스턴스를 생성하지 않고 기존 인스턴스로 라우팅한다.

singleTask로 설정된 액티비티에서 다른 액티비티를 호출하면 그 액티비티는 새로 생성된 태스크 위에 쌓인다.

ABCD에서 D 인텐트(singleTask)가 도착하고 E 인텐트(standard)가 도착하면

ABCD 와 DE 두개의 태스크가 존재하는 것이다.

#### singleInstace

singleTask와 동일하지만, 액티비티 호출시 항상 새로운 태스크가 생성된다.

singleTask과 다른 점은 오직 하나의 태스크에 하나의 액티비티만 존재할 수 있다.

인텐트 플래그 사용

startActivity()에 전달하는 인텐트에 플래그를 포함하여 액티비티와 태스크의 연결을 수정할 수 있다.

사용할 수 있는 플래그는 다음과 같습니다,

#### FLAG_ACTIVITY_NEW_TASK

액티비티를 새 태스크에서 시작합니다. 이미 실행 중인 태스크가 있다면 해당 태스크의 마지막 상태가 복원되어

포그라운드로 이동합니다. singleTask과 동일합니다.

#### FLAG_ACTIVITY_SINGLE_TOP

시작 중인 액티비티가 백스택의 맨위에 있으면 기존 인스턴스가 onNewIntent를 수신합니다.

singleTop과 동일합니다.

#### FLAG_ACTIVITY_CLAER_TOP

시작 중인 액티비티가 이미 태스크에서 실행 중이면 해당 인스턴스 위에 있는 다른 인스턴스들을 제거하고 맨 위로 올라옵니다.

이 동작과 같은 launchMode 속성 값은 없습니다.

ABCD 일때 B 인텐트가 도착하면 AB가 된다.