한 걸음 두 걸음

Activity LifeCycle LaunchMode에 대해 이해하기 본문

FrontEnd/Android

Activity LifeCycle LaunchMode에 대해 이해하기

언제나 변함없이 2019. 7. 13. 21:52
반응형

LaunchMode란?

Activity launchmode란 액티비티를 시작하는 방법에 대한 지침입니다. (액티비티별로 다르게 줄 수 있습니다!)

<activity 
          android:launchMode=["standard" | "singleTop" |
                              "singleTask" | "singleInstance"]
</activity>

위와 같이 매니페스트에서 4가지로 설정할 수 있으며, 인텐트를 처리하기 위해 액티비티를 호출할 때 발생하는 것을 결정하도록 Intent 객체에서 액티비티 플래그(3가지 : FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP
| FLAG_ACTIVITY_SINGLE_TOP)와 함께 작동합니다.

***이 포스팅은 1. ActivityLifeCycle 2. Intent Flag에 대해 알고 보는 것이 이해하는데 좋습니다 ***

-> 관련 포스팅 : LifeCycle https://onepinetwopine.tistory.com/120 Flag https://onepinetwopine.tistory.com/327

매니페스트를 열어보시면 아시겠지만, launchMode가 따로 설정되어있지 않습니다. launchMode는 따로 설정하지 않아도 디폴트로 "standard" 설정되어 사용되기 때문입니다.

4가지 모드는 사용 사례에 따라 두 개씩 묶이는데, 첫 번째 '대부분의 액티비티에 대한 일반적인 시작'으로 묶인 standard와 singleTop의 경우 시작 모드를 갖는 액티비티로 하여금 여러 개의 인스턴스를 갖는 것을 허용합니다.

일반적으로(standard) 인스턴스는 startActivity()를 호출한 task에서 시작합니다. 인스턴스는 어떤 스택이든 들어갈 수 있고, 액티비티 스택 내의 어떤 곳이든 위치할 수 있습니다.

Intent intent = new Intent(SubActivity.class); //SubActivity 인스턴스 생성 
startActivity(intent);

startActivity()는 이런 식으로 쓰이죠 ㅎㅎ

이와 달리 "singleTask" 및 "singleInstance" 액티비티는 단일 작업만 시작할 수 있습니다. 해당 액티비티는 항상 액티비티 스택의 루트에 있습니다. 또한 기기는 한 번에 단일 액티비티 인스턴스(해당 단일 작업)만 유지할 수 있습니다.


여기까지 두 사례로 묶어 특징을 살펴보았는데, 보다 더 구체적으로 4가지 모드에 대해 하나씩 살펴보도록 하겠습니다.

1. Standard

새 인텐트가 있을 때마다 해당 인텐트에 응답하도록 새 클래스 인스턴스가 생성됩니다.

(주황, 파랑 두 가지 )모든 액티비티가 standard로 설정되어있다고 했을 때 위에 겹치는게 있든 말든 항상 새로운 인스턴스를 만들어 쌓습니다.

2. singleTop

singleTop도 standard와 마찬가지로 새 인텐트가 생길 때마다 새 인스턴스를 만들지만, 만들려고 하는 인스턴스 작업이 이미 스택 맨 위에 있는 경우 해당 인스턴스는 onNewIntent() 호출을 통해 그대로 사용합니다. ( 새 인스턴스는 생성되지 않습니다. )
아래 사진은 주황색이 싱글 탑일 경우 예시입니다.

여기서 주황색이 sigletop, 파란색이 standard이면 아래와 같이 나타납니다.

(또는 주황색 액티비티의 인텐트가FLAG_ACTIVITY_CLEAR_TOP을 포함하는 경우)

3. singleTask

SingleTask를 준 액티비티를 실행시키면 반드시 새로운 stack(=task)을 만들어 루트 인스턴스가 됩니다.

까탈스러운 친구네요. 반드시 새 스택을 만들어 자신의 스택을 만으니까요. 여기서 "singleTask" 액티비티는 다른 액티비티가 작업의 일부가 되도록 허용합니다.

이렇게 자기가 만든 방을 다른 인스턴스와도 공유하죠. 나름 착하다고 할 수는 있네요. 게다가,

왼쪽 스택에 있었는데 노란색(singleTask)을 호출하는 상황이 생겼다고 했을 때,

파란색 다른 스택에서 노란색 액티비티를 호출하였지만, onNewIntent()로 재활용(: Activity Stack내 최상위로 올리고
밑에 stack에 있던 애는 삭제, 선입선출구조의 스택인데 여기서는 기존에 들어가있던 인스턴스가 삭제되고 새로 불린 인스턴스가 루트 인스턴스로 들어가기때문에 삭제라 표현했습니다.)됩니다. 이처럼 액티비티 인스턴스가 이미 존재하는 경우 시스템은 새 인스턴스를 생성하는 대신onNewIntent()메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅합니다. 여기서 시스템은 singleTop처럼 맨 위의 스택과 비교하는 것이 아닙니다.

 

SingleTask A가 있다고 할때 

startActivity(A);
startActivity(A);


두 번 호출하면
첫 번째는 onCreate() …~
두 번째부턴 onNewIntent() -> onResume()의 순서로 호출

4. singleInstance

singleInstance는 가장 까탈스러운 친구입니다. 공간 욕심도 많고요..

일단 singleTask처럼 호출될 때 새로운 task에 인스턴스가 들어갑니다. 여기까진 같지만,

자신만의 공간에 다른 인스턴스가 오는 것을 참을 수 없습니다. 혼자 그 큰 task를 다 쓰죠. 시스템이 인스턴스를 보유하는 작업에서 다른 액티비티를 시작하지 않는 점을 제외하면 "singleTask"와 동일합니다. 액티비티는 항상 해당 작업의 단일 멤버입니다.


standard와 singleTop도 다수의 액티비티 유형에 유용하고 일반적인 시작 모드입니다.

singleTask및singleInstance는대부분의 애플리케이션에 적합하지 않습니다.
(왜냐하면 해당 모드는 사용자에게 친숙하지않은 다른 애플리케이션과의 상호작용 모델이기 때문입니다)
이는 인텐트 플래그와 함께 상호작용하므로 꼭 위에서 걸어놓은 인텐트 플래그도 함께 공부하시기를 추천드립니다.

레퍼런스 :https://developer.android.com/guide/topics/manifest/activity-element

https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=ko


launchMode는 Life cycle과도 밀접하고 Activity Stack과도 밀접하며 xml 과 Code 레벨 둘 다 적용가능해서 AndroidManifest까지 건들 수 있습니다.


직접 개발해서 테스트 시작

이론을 익혔으니 손으로 타이핑해가면서 push notification 구현 프로젝트에 적용해서 잘 되는 지 확인해보고 동작 레벨로도 이해하는 과정을 다음 포스팅으로 작성하겠습니다.

반응형