본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Manifest Activity 태그의 launchMode 에 대해 들어보셨나요?

by 돼지왕 왕돼지 2012. 1. 27.
반응형



1. Information


launchMode 라는건 생소한데 뭐죠?


 Developer 를 참조하여 설명드리자면, activity 가 어떤 형태로 launch 되어야 하는지를 설명하는 속성입니다.
이 녀석은 Manifest 의 Activity 태그의 android:launchMode = "[launchMode]" 를 통해서도 값이 입력될 수 있고,
activity 를 실행 할 때 사용하는 intent 의 flag 설정을 통해서도 설정할 수 있습니다. 가능합니다.
 

manifest 를 통한 launchMode 는 4가지 모드를 지원합니다.

 "standard" ( default )
 "singleTop"
 "singleTask"
 "singleInstance"


이 녀석들은 Intent 의 flag 형태로도 올 수 있습니다.

FLAG_ACTIVITY_STANDARD ( default )
FLAG_ACTIVITY_ SINGLE_TOP
FLAG_ACTIVITY_ SINGLE_TASK
FLAG_ACTIVITY_ SINGLE_INSTANCE


이 네 가지 모드는 2가지의 group 으로 나눌 수 있는데 한 부류는 standard & singleTop 이고, 다른 한 부류는 singleTask & singleInstance 입니다.



먼저 standard 와 singleTop 에 대해서 설명해주세요


 standard & singleTop 는 activity 를 여러 번 생성 할 수 있습니다. 또한 activity 의 instance 는 어떤 task 이던지 존재 할 수 있습니다.
보통 이 option 을 가진 activity 들은 다른 특별한 설정이 없다면, 호출하는 task 의 최상단에 존재하게 됩니다.
( 특별한 설정은 FLAG_ACTIVITY_NEW_TASK 나 taskAffinity attribute 설정 등.. )

standard 의 경우는 intent 를 통해 launch 될 때마다 매번 새로운 instance 를 생성합니다. 

반면에 singleTop 의 경우는 target task에 동일한 activity 의 instance 가 top 에 위치해 있을 때만, instance 를 새로 생성하지 않고,
top 에 있던 instance 의 onNewIntent() 를 대신 호출해줍니다.
생명주기는.. onPause() -> onNewIntent() -> onResume() 이 불립니다.

[생명주기에 대한 실험 내용 글]





그럼 singleTask 와 singleInstance 는요?


standard & singleTop 과는 반대로 singleTask 와 singleInstance오직 한 개의 instance 만을 가질 수 있습니다. 

게다가 이 option으로 설정된 녀석들은 task 를 시작하게 됩니다. 그래서 항상 stack 의 root 를 차지하고 있죠.


[2018-06-14 added]

https://stackoverflow.com/questions/33943588/android-singletask-activity-not-as-the-root

https://medium.com/@iammert/android-launchmode-visualized-8843fc833dbe

위 2개의 글에 따르면 singleTask 의 경우 single instance 는 보장하지만, task root 를 보장하지 않는다.

singleInstance 의 경우 single instance 와 task root 를 보장한다.

게다가 singleTask 는 clearTop 처럼 작동한다.



singleTask다른 activity 들이 자신의 instance 위에 쌓이는 것을 허락해줍니다.

하지만 singleInstance 다른 activity 를 자신의 task 안에 포함시키지 않습니다.
그래서 singleInstance 에서 어떤 activity 를 launch 시키면 자신의 task 위에 쌓지 않고, 다른 task 또는 새로운 task 위에 쌓아 놓습니다.
( 이것은 FLAG_ACTIVITY_NEW_TASK 와 비슷한 효과입니다. )



launchMode 사용할 때 주의할 점은 없나요?


 Developer 를 보면 singleTask 와 singleInstance에 대해서는 빨간색 으로 표시하면서까지
이 옵션들은 대부분의 application 에서 사용하지 않기를 권고하고 있습니다.
왜냐면, 일반적인 User 의 상식에서 벗어나서 UX 측면에서도 안 좋을 뿐더러, 오작동을 초래하기도 쉽기 때문입니다.

또한 어떤 launchMode 를 적용하든간에 Back key 를 누르는 등의 테스트를 충분히 하여
원하는 데로 task 관리가 되고 있는지를 확인할 것도 권장 하고 있습니다.


[launchMode 에 대한 추가정보들]



[Developer 에 생기는 의문..] - 2018-06-14 해결?

이미지 출처 : http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

singleTask launchMode 가 single instance 는 보장하지만, task root 를 보장하지 않음을 인정하면 위의 그림이 이해된다.





2. Summary


- launchMode 는 Manifest 의 activity 태그의 android:launchMode 를 통해 설정되거나 intent 의 flag 를 통해 설정되는 값으로, 해당 activity 가 어떻게 launch 되어야 하는지를 정의하는 값이다.

- launchMode 는 "standard", "singleTop", "singleTask", "singleInstance" 가 있다.

- "standard"는 activity 의 multi-instance 를 허락하며, launch 될때마다 instance 가 생성되며 task 의 top 에 쌓인다.

- 'singleTop" 은 activity 의 multi-instance 를 허락하지만, 동일한 activity 가 target task 의 top 에 존재한다면 생성하지 않고 top activity instance 의 onNewIntent() 를 대신 호출한다.

- "singleTask" 는 device 당 1개의 activity instance 를 허락하며, task 의 root 가 되어 다른 activity 가 자신의 위에 쌓이는 것을 허락한다. 

- "singleInstance" 는 device 당 1개의 activity instance 를 허락하며, task 의 root 가 되며, 다른 activity 와  task 를 공유하지 않는다.




3. References


http://developer.android.com/guide/topics/manifest/activity-element.html#lmode 
   Android Developer Doc. Manifest의 Activity 태그의 launchMode

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html 
   Android Developer Doc. Dev Guide. Tasks and Back Stack










반응형

댓글