개발일지

Android in A..Z - Launch Mode (Manifest) 본문

Android (안드로이드)

Android in A..Z - Launch Mode (Manifest)

강태종 2021. 10. 12. 17:58

알람 앱을 실행 후 MainActivity에서 AlarmActivity로 이동했고 홈 버튼을 눌러 태스크를 백그라운드로 보냈다. 그리고 알람에 맞춰 AlarmDialogActivity가 실행됐다. 그렇다면 AlarmDialogActivity가 백그라운드에 있는 태스크에 속하게 됩니다. 태스크를 포그라운드로 불러오고 백 버튼을 누르면 AlarmDialogActivity에서 어떤 Activity로 가야할까요?

 

이러한 규칙은 launchMode로 설정할 수 있고, Launch Mode는 manifest 또는 Intent로 설정할 수 있다.

* 앱 실행히 하나의 Task가 생성되며 Launch Mode나 Intent를 통해 새로운 Task를 만들 수 있다.


Manifest 설정

standard

Activity를 시작할 때 무조건 새로운 인스턴스를 만듭니다. (기본값입니다.)

 

* Activity를 A->B->C->A->B->C 순으로 생성하면 ABCABC가 스택에 쌓인다.

 

시나리오 : A->B->C->A->B->C

-> onCreate를 호출하며 새로운 Instace를 생성한다.

2021-10-08 03:17:06.665 29507-29507/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:17:06.817 29507-29507/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:17:08.785 29507-29507/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:17:08.818 29507-29507/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:17:09.707 29507-29507/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:17:09.727 29507-29507/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:17:10.845 29507-29507/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:17:10.866 29507-29507/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:17:11.491 29507-29507/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:17:11.511 29507-29507/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:17:12.592 29507-29507/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:17:12.610 29507-29507/com.taetae98.launchmode D/PASS: onCStart

 

singleTop

Activity를 시작할 때 보통 새로운 인스턴스를 만듭니다. 하지만 최상위 스택에 Activity가 존재하는 경우 새로운 인스턴스를 만드는게 아닌 재활용합니다.

 

* 재활용하는 경우 onCreate를 호출하는 것이 아닌 onNewIntent를 호출하고 onStart를 호출한다.

 

시나리오 : A -> B -> C -> B -> C -> C -> B(POP)  *C를 singleTop으로 적용

-> 2번째 C로 이동할 때 onCreate를 호출하며 새로운 Instance를 만들지만 3번째 C로 이동할 때 onNewIntent를 호출하며 기존의 인스턴스를 재활용합니다. 또한 뒤로가기 버튼을 누를시 B로 이동하는 것을 확인할 수 있습니다.

2021-10-08 03:33:32.761 30585-30585/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:33:32.911 30585-30585/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:33:45.519 30585-30585/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:33:45.549 30585-30585/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:33:46.228 30585-30585/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:33:46.248 30585-30585/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:34:52.515 30585-30585/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:34:52.539 30585-30585/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:34:53.513 30585-30585/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:34:53.541 30585-30585/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:34:54.792 30585-30585/com.taetae98.launchmode D/PASS: onCNewIntent
2021-10-08 03:35:11.258 30585-30585/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:35:11.774 30585-30585/com.taetae98.launchmode D/PASS: onCDestroy

 

singleTask

하나의 Task에서 하나의 Instance만 존재할 수 있다. 만약 Task에 존재하는 Instance를 다시 호출할 경우 singleTop처럼 onNewIntent를 호출하며 재사용한다. singleTop과 다른 점은 재사용하는 Instance위의 모든 Activity를 제거한다.

 

* singleTop은 최상위에 Activity가 있을 때 재사용하지만 singleTask는 동일 Task에 하나만 존재하고 상위 Instance를 제거하며 재사용한다.

 

시나리오 : A -> C -> B -> C -> A(POP)  *C를 singleTask로 적용

2번째 C를 호출할 때 C를 재사용하며 B를 제거한다.

2021-10-08 03:32:44.022 30452-30452/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:32:44.188 30452-30452/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:32:49.823 30452-30452/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:32:49.861 30452-30452/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:32:53.442 30452-30452/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:32:53.466 30452-30452/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:32:54.741 30452-30452/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:32:54.742 30452-30452/com.taetae98.launchmode D/PASS: onCNewIntent
2021-10-08 03:32:55.221 30452-30452/com.taetae98.launchmode D/PASS: onBDestroy
2021-10-08 03:33:06.718 30452-30452/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:33:07.273 30452-30452/com.taetae98.launchmode D/PASS: onCDestroy

 

singleInstance

새로운 Task를 만들고 해당 Task는 하나의 Activity만 존재 가능하다. 또한 Task에 Activity가 존재한 경우 새로 만드는 것이 아닌 재활용하며 해당 Task에서 Instace를 호출하면 다른 Task에 Instance를 생성한다.

 

시나리오 : A ->C -> B -> C -> A -> B(POP) -> A(POP) -> C(POP) *C를 singleInstance로

1. A -> C -> B를 진행한 경우 Task1(A, B) Task2(C)가 존재한다. => C에서 B를 만들어도 Task2는 하나의 Instance만 가질 수 있으며 B는 Task1로 이동한다.

2. B -> C -> A를 진행한 경우 Task1(A, B, A) Task2(C)가 존재한다. => C를 호출한 경우 재활용하며, C에서 A를 만든 경우 1번과 같은 이유로 Task1에 A를 생성한다.

3. A -> B(POP) -> A(POP)를 진행한 경우 Task1(A) Task2(C)가 존재한다. => C는 Task2에 있기 때문에 뒤로가기시 C로 돌아가지 않고 Task1에 있는 Activity로 돌아간다.

4. C(POP)을 진행한 경우, Task1이 비기 때문에 Task2로 이동한다.

 

2021-10-08 03:51:21.399 31751-31751/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:51:21.543 31751-31751/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:51:31.751 31751-31751/com.taetae98.launchmode D/PASS: onCCreate
2021-10-08 03:51:31.776 31751-31751/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:51:33.067 31751-31751/com.taetae98.launchmode D/PASS: onBCreate
2021-10-08 03:51:33.090 31751-31751/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:51:38.058 31751-31751/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:51:38.058 31751-31751/com.taetae98.launchmode D/PASS: onCNewIntent
2021-10-08 03:51:43.233 31751-31751/com.taetae98.launchmode D/PASS: onACreate
2021-10-08 03:51:43.257 31751-31751/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:51:44.948 31751-31751/com.taetae98.launchmode D/PASS: onBStart
2021-10-08 03:51:45.442 31751-31751/com.taetae98.launchmode D/PASS: onADestroy
2021-10-08 03:51:45.783 31751-31751/com.taetae98.launchmode D/PASS: onAStart
2021-10-08 03:51:46.290 31751-31751/com.taetae98.launchmode D/PASS: onBDestroy
2021-10-08 03:51:46.726 31751-31751/com.taetae98.launchmode D/PASS: onCStart
2021-10-08 03:51:50.197 31751-31751/com.taetae98.launchmode D/PASS: onADestroy
2021-10-08 03:51:50.574 31751-31751/com.taetae98.launchmode D/PASS: onCDestroy

'Android (안드로이드)' 카테고리의 다른 글

Android in A..Z - Manifest  (0) 2021.10.12
Android in A..Z - Broadcast Receiver  (0) 2021.10.07
Android in A..Z - Service  (0) 2021.10.07
Android in A..Z - Fragment  (0) 2021.10.04
Android in A..Z - Glide Advanced  (0) 2021.10.01
Comments