출처
: http://aroundck.tistory.com/63
: http://www.slideshare.net/luvgaram/activity-launch-mode (안드로이드 Activity Launch mode.pdf)
참조할만한 자료
안드로이드 Activity Launch mode.pdf
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() 이 불립니다.
[생명주기에 대한 실험 내용 글]
출처: http://aroundck.tistory.com/62
Activity LifeCycle (생명주기) 를 확실히 알아 볼 수 있는 실험들 참여 해보시겠어요?
1. Information.
어떤 실험들을 하실 예정인가요?
Activity의 Life Cycle.. 즉 액티비티 생명주기를 알아보기 위해 다음과 같은 실험을 해보았고, 결과만을 공유해드리겠습니다.
실험 소스 코드는 startActivity() 를 부른것과 manifest 에서 launchMode 를 바꿔준 것 이외에는 특별히 한 것이 없습니다.
아! 물론 각 생명주기, onCreate, onStart, onResume, onPause, onStop, onRestart, onDestory 에 로그는 찍었습죠 :)
1. A, B Activity 가 있을 때 A activity 가 B activity 를 호출하는 경우.
2. A, B Activity 가 있을 때 A activity 가 Dialog 를 상속한 B Activity 를 호출할 경우.
3. A Activity 가 있을 때 A activity 에서 Home 키를 눌렀을 경우.
4. A,B,C Activity 가 있을 때 B Activity의 launchMode 가 singleTask일 때, A -> B -> C -> B 순으로 호출하는 경우.
5. A, B Activity 가 있을 때 B Activity 의 launchMode 가 singleTop 일 때, A -> B -> B 순으로 호출하는 경우.
재미있겠죠?
1번 실험결과 부터 빨리 알려주세요.
[실험내용]
A와 B Activity 가 있다. A Activity 를 launch 시킨 후, A Activity에서 바로 B Activity 를 호출한다.
[실험결과]
A.onCreate() -> A.onStart() -> A.onResume() -> A.onPause()
-> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
[특이사항]
A.onPause() 는 B Activity 를 실행시키며 바로 호출되지만, A.onStop() 은 B Activity 의 onResume() 이 불린 후에 불린다.
[추가실험]
B Activity 가 떠 있는 상태에서 Back key 를 눌러본다.
[실험 결과]
B.onPause() -> A.onRestart() -> A.onStart() -> A.onResume() -> B.onStop() -> B.onDestory()
[특이 사항]
A가 Pause 되어있던 상황이기 때문에 onRestart() 를 먼저 타게 되고, onStart(), onResume() 순으로 탄다.
B.onStop() 은 앞 실험과 마찬가지로 A의 onResume() 이 불린 후에 타고, B는 사라지는 Activity 이므로 B.onDestory() 가 불린다.
2번 실험 결과도 빨리 알려주세요
[실험내용]
A와 B Activity 가 있다. B Activity 는 Dialog 를 상속한 Activity 이다.
A Activity 를 launch 시키고, A Activity는 바로 B Activity 를 호출한다.
[실험 결과]
A.onCreate() -> A.onStart() -> A.onResume() -> A.onPause()
-> B.onCreate() -> B.onStart() -> B.onResume()
[특이 사항]
A의 onStop() 이 불리지 않는다.
[추가 실험]
Dialog 를 상속한 B Activity 가 떠 있는 상태에서 Back key 를 눌러본다.
[실험 결과]
B.onPause() -> A.onResume()
-> B.onStop() -> B.onDestory()
[특이 사항]
A의 onRestart(), onStart() 가 불리지 않고 바로 onResume() 이 호출된다. onStop() 이 안 불렸기 때문이다.
흥미진진한데, 3번도 빨리 갑시다.
[실험 내용]
A Activity 가 있다. A Activity 를 실행시킨 후 Home 키를 누른다.
[실험 결과]
Launcher 가 개입된다는 거 외에는 별 다른 차이점이 없다..
4번은?? 4번은요?!
[실험 내용]
A, B, C 세 개의 Activity 가 있다. 이 중 B 는 launchMode = "singleTask" 로 되어 있다.
A -> B -> C -> B 순으로 호출한다.
[실험 결과]
A.onCreate() -> A.onStart() -> A.onResume() -> A.onPause()
-> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop() -> B.onPause()
-> C.onCreate() -> C.onStart() -> C.onResume() -> B.onStop() -> C.onPause()
-> B.onRestart() -> B.onStart() -> B.onResume() -> C.onStop() -> C.onDestory()
[특이사항]
B가 singleTask 이기 때문에 C를 destory 시킨다. B 위의 모든 Activity 들은 모두 pop 된다.
마지막 5번도 빨리 알려주세요
[실험 내용]
A, B 두개의 Activity 가 있다. 이 중 B 는 launchMode = "singleTop" 이다.
A -> B -> B 순으로 호출한다.
[실험결과]
A.onCreate() -> A.onStart() -> A.onResume() -> A.onPause()
-> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStrop()
-> B.onPause() -> B.onResume()
[특이사항]
singleTop 이기 때문에 B 자신 위에 또 B 자신을 띄우지 않고,
onPause() -> onResume() 을 타는 과정만 거친다.
2. Summary
- Activity 의 생명주기를 실험을 통해서 살펴봄으로서, 더 쉽고 정확하게 이해 할 수 있다.
- 실험 내용은 다음과 같으며, 결과만 공유한다. 결과의 핵심파트가 많아서 Summary 하지 않고 본문을 Bold 로 대체하였다.
1. A, B Activity 가 있을 때 A activity 가 B activity 를 호출하는 경우.
3. References
- http://jeh86122.blog.me/130085195419
Jung Euihan 님의 네이버 블로그.
- http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
Android Developer Doc. Activity의 Activity Lifecycle
그럼 singleTask 와 singleInstance 는요?
standard & singleTop 과는 반대로 singleTask 와 singleInstance 는 오직 한 개의 instance 만을 가질 수 있습니다.
게다가 이 option으로 설정된 녀석들은 task 를 시작하게 됩니다. 그래서 항상 stack 의 root 를 차지하고 있죠.
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 에 대한 추가정보들]
Broswer 와 Launcher 는 보통 SingleTask 를 launchMode 로 사용합니다.
launchMode 는 manifest 뿐만 아니라 intent 의 flag 로도 설정될 수 있습니다.
설정의 우순순위는.. 경우에 따라 달라서 확실히 정의하기 어렵네요.
[Developer 에 생기는 의문..]
이미지 출처 : http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
Developer 의 글에 따르면 "singleTask" 로 정의된 activity 의 경우 root 밖에 될 수 없다고 기술되어 있습니다.
하지만, developer에서 제공하는 figure 를 보면 Activity Y 의 launchMode 가 singleTask 로 설정되어 있으면서도 다른 activity 위에 올라가 있습니다.
이 부분에 대해서는 확인이 필요합니다. 확실히 아시는 분은 comment 좀 남겨주세요.
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
'IT_Programming > Android_Java' 카테고리의 다른 글
[펌] 안드로이드 : Webview 세큐리티 문제. JavascriptInterface (0) | 2014.07.21 |
---|---|
Retrofit - 쉽고 빠른 Android HTTP REST 인터페이스 라이브러리 (0) | 2014.07.19 |
android:launchMode, singleTop과 singleTask의 차이 (0) | 2014.07.18 |
[펌] startActivityForResult()로 실행되는 activity 가 다른 task에 있다면? (0) | 2014.07.18 |
안드로이드 하단 네비게이트 - 시스템 바 (홈버튼, 백버튼,옵션버튼) 숨기기 (0) | 2014.07.16 |