Activity가 어떻게 실행될지에 대한 설정이다. AndroidManifest.xml에서 설정이 가능하다.
Activity Flag(FLAG_ACTIVITY_* 상수)와 같이 작동한다. Intent객체에 담겨 전달되며 인텐트를 처리하기 위해서 사용한다.
"standard"
"singleTop"
"singleTask"
"singleInstance"
"singleInstancePerTask"
5가지가 있다.
기본 설정으로 여러 번 인스턴스화 될 수 있다. 인스턴스들은 어느 task에도 속할 수 있고 activity task의 어느 장소에도 위치될 수 있다. 일반적으로는 startActivity()가 호출될 때 시작된다. 다만, Intent에 FLAG_ACTIVITY_NEW_TASK가 포함된 경우는 예외로 다른 task가 선택된다.
Intent객체가 생성될 때마다 새로운 인스턴스를 만들어 대응하게된다. 각 인스턴스는 단일 인텐트를 처리한다.
standard 모드와 거의 동일한 성질을 가지고 있지만 한가지 면이 다르다. standard모드에서는 새로운 인텐트가 오면 매번 새로운 인스턴스를 만들었다면 singleTop에서는 task의 상단에 이미 기존 인스턴스가 있는 경우 onNewIntent()를 통해 새 인텐트를 수신한다. 이때 새 인스턴스가 생성되지 않는다. 다만 스택 상단에 없는 경우 이미 인스턴스가 있더라도 새로운 인스턴스를 생성해서 스택에 푸시한다.
Main(singleTop) -> Sub(standard)로 이동했으며 여기서 navigate up을 한 경우 Main이 다시 스택의 상단으로 오면서 새로 인스턴스를 만들지 않고 onNewIntent()를 통해서 인텐트를 처리하게 된다.
또는 up 인텐트가 FLAG_ACTIVITY_CLEAR_TOP을 포함하는 경우도 동일하게 작동한다.
singleTask로 설정된 Activity는 이미 존재하는 Activity의 인스턴스로 task를 만들어 라우팅해준다. 만약 Activity가 다른 프로세스에서 실행중이면 onNewIntent를 통해 인텐트가 존재하는 인스턴스로 라우팅된다. 인스턴스는 한번에 하나만 존재할 수 있다.
singleTask와 유사하나 singleInstance로 지정된 Activity는 하나의 task에 하나의 인스턴스만 존재할 수 있다.
예를 들면 A는 singleInstance로 B와 C는 standard로 설정한 경우 A task에는 A instance만 추후에 실행시킨 B와 C는 다른 task로 분리되어 실행된다. B에서 A를 실행하는 경우는 onNewIntent를 통해서 실행되게 된다.
singleInstance와 유사하지만 singleTask가 모든 task에 대해서도 하나만 존재할 수 있다면 singleInstancePerTask는 한 task에 대해서 유일한 인스턴스로 생성된다.
| 사용 사례 | 시작 모드 | 다중 인스턴스? | 참고 |
|---|---|---|---|
| 대다수 활동의 일반적인 시작 | standard | 예 | 기본값입니다. 시스템은 항상 타겟 작업에 새 활동 인스턴스를 생성하여 인텐트를 인스턴스로 라우팅합니다. |
singleTop | 조건부 | 활동의 인스턴스가 이미 타겟 작업의 맨 위에 존재하는 경우 시스템은 새 활동 인스턴스를 생성하는 대신 onNewIntent() 메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅합니다. | |
| 특수한 시작 (일반 용도에는 권장되지 않음) | singleTask | 조건부 | 시스템은 새 작업의 루트에서 활동을 만들거나 같은 어피니티를 사용하여 기존 작업에서 활동을 찾습니다. 활동의 인스턴스가 이미 존재하고 작업의 루트에 있으면 onNewIntent() 메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅합니다. |
singleInstance | 아니요 | singleTask와 동일하지만 시스템이 인스턴스를 보유한 작업으로는 어떤 다른 활동도 실행하지 않는다는 점이 다릅니다. 활동은 항상 작업의 유일한 단일 멤버입니다. | |
singleInstancePerTask | 조건부 | 이 활동은 작업의 루트 활동, 즉 작업을 만든 첫 번째 활동으로만 실행될 수 있으므로 작업에는 이 활동의 인스턴스가 하나만 있습니다. 그러나 활동은 서로 다른 작업에서 여러 번 인스턴스화될 수 있습니다. |