본문 바로가기

프로그래밍/안드로이드

[안드로이드] 런치 ( Launch ) 모드


<activity> 엘리먼트의 launchMode 속성에는 네 가지의 모드가 있습니다.
" standard " ( 디폴트 ) , "singleTop" ,  "singleTask" , "singleInstance" 인데요.
하나씩 한번 알아보지요.






1. standard (디폴트)

▣ 인텐트 객체가 FLAG_ACTIVITY_NEW_TASK 플래그를 가지지 않았다면 인텐트를 만들고 startActivity() 를 호출한 액티비티가 있는 태스크입니다. FLASG_ACTIVITY_NEW_TASK 플래그를 가지고 있다면
' 어피니티와 태스크 ' 에서 처럼 다른 태스크가 선택됩니다.

▣ 여러번 인스턴스화 될 수 있어서 다양한 태스크에 속할 수 있고, 주어진 태스크는 동일한 액티비티의 여러개의 인스턴스를 가질 수 있습니다.

▣ 스택의 위치 중 어디에도 위치할 수 있습니다.

▣ 새로운 인스턴스가 모든 신규 인텐트에 응답하도록 생성됩니다.

2. singleTop

▣ 인텐트 객체가 FLAG_ACTIVITY_NEW_TASK 플래그를 가지지 않았다면 인텐트를 만들고 startActivity() 를 호출한 액티비티가 있는 태스크입니다. FLASG_ACTIVITY_NEW_TASK 플래그를 가지고 있다면
' 어피니티와 태스크 ' 에서 처럼 다른 태스크가 선택됩니다.

▣ 여러번 인스턴스화 될 수 있어서 다양한 태스크에 속할 수 있고, 주어진 태스크는 동일한 액티비티의 여러개의 인스턴스를 가질 수 있습니다.

▣ 스택의 위치 중 어디에도 위치할 수 있습니다.
---> 여기까진 standard 속성과 동일합니다.

▣ 위치가 대상이 되는 태스크의 최상위 액티비티라면 이미 존재하는 클래스 인스턴스가 신규 인텐트 처리를 위해 재사용됩니다 ( 최상위에 존재하지 않으면 재사용되지 않음. 단, 신규 인텐트를 위한 새로운 인스턴스를 생성하여 스택에 푸시함. )


3. singleTask

▣ 액티비티가 항상 태스크의 루트에 위치합니다. 절대 다른 태스크안에 들어가지 않습니다.
▣ 단 한개의 인스턴스만 가집니다. 즉, 태스크의 루트에 위치하는 것입니다. 때문에 그 태스크의 인스턴스가 한개 이상 동시에 있을 수 없다는 제약조건이 적용된다고 볼 수 있습니다.

▣ 태스크에 지정된 다른 액티비티들을 시작시킬 수 있습니다.


4. singleInstance()

▣ 액티비티가 항상 태스크의 루트에 위치합니다. 절대 다른 태스크안에 들어가지 않습니다.
▣ 단 한개의 인스턴스만 가집니다. 즉, 태스크의 루트에 위치하는 것입니다. 때문에 그 태스크의 인스턴스가 한개 이상 동시에 있을 수 없다는 제약조건이 적용된다고 볼 수 있습니다.
--> 여기까진 singleTask 와 동일

▣ 태스크 내에서 하나의 액티비티로 존재합니다.
▣ 다른 액티비티를 시작시키면 시작될 액티비티는 다른 태스크에 런치됩니다. ( 이것은 곧 인텐트 내에 FLAG_ACTIVITY_NEW_TASK 플래그가 있는것과 동일한 효과죠 )




예를들어 태스크의 액티비티 스택이 A-B-C-D 순으로 되어있다고 해보겠습니다.



D 액티비티에 인텐트가 도착하는데 D가 "standard" 모드라면 새로운 클래스 인스턴스가 생성되어서 스택은 A-B-C-D-D 가 됩니다.


만약 D의 모드가 "singleTop" 모드라면 현재 D는 스택의 최상위에 있기 때문에 기존에 존재하던 인스턴스가 인텐트를 처리하게 됨으로써 스택은 A-B-C-D 로 남게됩니다.



도착한 인텐트가 B 액티비티에 대한 것이라면 어떨까요?
B 는 스택의 최상위에 있지 않기 때문에 "standard" 또는 "singleTop" 모드와는 관계없이 새로운 B 인스턴스가 런치되면서 스택은 A-B-C-D-B 가 되겠습니다.

"singleInstance" 모드를 갖는 액티비티는 하나의 인스턴스만 가지기 때문에 항상 인텐트 처리를 위하여 스택의 최상위에 위치합니다.

그러나 "singleTask" 는 스택의 상위에 다른 액티비티가 위치할 수도 있고, 없을수도 있겠는데요, 만약에 상위에 다른 액티비티가 있다면 인텐트 처리를 위한 위치에 있는것이 아니므로 결국 그 인텐트는 누락되겠죠.
[ 인텐트가 도착하면 태스크가 포그라운드로 오기때문에 태스크는 그 상태 그대로 남는것과 같습니다 ]

마지막으로, 이미 존재하는 액티비티가 새로운 인텐트 처리를 요청받으면, 인텐트 객체는 onNewIntent() 메소드 호출로 액티비티에 전달됩니다.



getIntent() 메소드를 이용하여 액티비티를 시작한 인텐트 객체를 구할 수 있겠습니다.


출처 : http://underclub.tistory.com/281