본문 바로가기

Program/Android

Android <Activity - android:launchMode>


액티비티가 어떻게 런치되어야 하는 지에 대한 명령. 인텐트를 처리하기 위해 액티비티가 호출될 때 무엇이 발생해야 하는 지를 결정하기 위해, 인텐트 오브젝트의 액티비티 플래그(FLAG_ACTIVITY_* 상수)와 함께 동작하는 네 가지 모드가 있다. 그것은 다음과 같다.

"standard" "singleTop" "singleTask" "singleInstance"

디폴트의 모드는 “standard”이다
 

그 모드들은 두 가지 주요 그룹으로 나뉘어 진다. 한쪽에는 “standard” 와 “singleTop” 액티비티들이 있으며, 다른 한쪽에는 “singleTask” 와 “singleInstance”가 있다. “standard” 또는 “singleTop” 런치 모드를 가지는 액티비티는 여러 번 인스턴스화 될 수 있다. 인스턴스는 어떤 태스크에도 속할 수 있으며, 그리고 액티비티 스택의 어느 곳에든 놓여질 수 있다. 
일반적으로 그것들은 startActivity()를 호출한 태스크에서 런치된다(인텐트 오브젝트가 FLAG_ACTIVITY_NEW_TASK 명령을 포함하지 않는 한 그러하며, 이 경우에는 다른 태스크가 선택되어 진다 - taskAffinity 애트리뷰트를 보라).
 

그에 반하여, “singleTask” 와 “singleInstance” 액티비티들은 오직 하나의 태스크를 시작할 수 있다. 그것들은 항상 액티비티 스택의 루트에 위치한다. 더욱이, 디바이스는 한 번에 ? 오직 하나의 그 태스크에서 오직 하나의 액티비티 인스턴스를 보유할 수 있다.
 

“standard” 와 “singleTop” 모드는 단지 한 측면에서만 서로 차이가 있다: “standard” 액티비티를 위한 신규 인텐트가 있을 때마다, 신규 클래스 인스턴스가 그 인텐트에 응답하기 위해 생성된다. 각각의 인스턴스는 하나의 인텐트를 처리한다. 비슷하게 “singleTop” 액티비티에 대한 신규 인스턴스 또한 신규 인텐트를 처리하기 위해 생성될 수 있다. 하지만 타겟 태스크가 이미 그것의 스택의 최상위에 그 액티비티에 대한 인스턴스를 가지고 있다면, 그 인스턴스가 신규 인텐트를 수신할 것이다(onNewIntent() 호출에서); 신규 인스턴스는 생성되지 않는다. 다른 상황에서는 - 예를 들어 만약 “singleTop” 액티비티에 대한 이미 존재하는 인스턴스가 타겟 태스크에 있으나 그것이 스택의 최상위에 있지 않다면, 또는 그것이 스택의 최상위에 있으나 타겟 태스크에는 있지 않다면 ? 신규 인스턴스는 생성될 것이고 스택에 푸쉬된다.

“singleTask” 와 “singleInstance” 모드들 또한 오직 한 측면에서만 서로 차이가 있다: “singleTask” 액티비티는 다른 액티비티가 그것의 태스크의 일부가 되는 것을 허용한다. 그것은 액티비티 스택의 루트에 있으나, 다른 액티비티들(반드시 “standard” 와 “singleTop” 액티비티)은 같은 태스크에서 런치될 수 있다. 반면에, “singleInstance” 액티비티는 어떤 액티비티도 그것의 태스크의 일부가 되는 것을 허용하지 않는다. 그것은 태스크 안에 있는 유일한 액티비티이다. 만약 그것이 다른 액티비티를 시작한다면, 그 액티비티는 다른 태스크에 할당된다 ? 마치 FLAG_ACTIVITY_NEW_TASK가 인텐트에 있었던 것처럼.

런치 모드와 인텐트 플래그를 사용한 그것들의 상호작용에 대한 더 많은 정보는, 2장. “애플리케이션 기초”의 “액티비티와 태스크”를 보라.

'Program > Android' 카테고리의 다른 글

LayoutInflater  (1) 2011.10.29
SQLite Database Browser - Android & iOS  (0) 2011.10.24
안드로이드 이미지 확대 검색 소스 1  (2) 2011.10.12
Android LogCat Unicode  (1) 2010.12.13
iMac & Android  (2) 2010.08.09