Task?
Activity Stack을 알아보기 전에 먼저 Task의 개념부터 가볍게 짚고 넘어가자.
Task는 진짜 정말 간단하게 "실행중인 앱" 을 확인할 때 볼 수 있는 하나하나의 앱이라고 생각할 수 있다.
앱을 실행하면 해당되는 앱의 Task를 시작하고 Task를 통해 실행중인 앱들을 관리할 수 있다. Task는 Stack형태로 해당 앱을 관리할 수 있게 만들어준다.
Activity Stack?

기본적으로 앱을 실행하게되면 main Activity (manifest에서 설정)가 실행되며 이후 다른 Activity 를 실행하게되면 실행되던 Activity는 따로 설정하지 않으면 Destroy되지 않고 스택에 쌓여있는다.
스택은 선입후출의 구조를 가지고 있어서 가장 먼저 들어온 Activity는 스택 가장 아래에 쌓여있고 이를 root Activity라고 한다. 반대로 가장 늦게 들어와서 우리가 보고있는 액티비티는 top Activity 라고 한다.
Activity를 (root)1 - 2 - 3(top) 의 순서로 실행해서 스택에 쌓게되면 Activity1은 root Activity, Activity3은 top Activity가 된다. 이때 top Activity인 Activity3를 뒤로가기 버튼이나 finish()메서드를 통해 Destroy하게 되면 바로 아래에 있던 Activity2가 ON_RESUME 되어 top Activity가 된다.
반대로 Activity를 (root)1 - 2 - 3(top) 순서로 실행한 상태에서 다시 Activity2를 실행하면 어떻게될까?
원래 있던 Activity2를 불러오는 것이 아닌 Activity2의 새 인스턴스를 생성해서 스택은 (root)1 - 2 - 3 - 2(top)가 된다.
스택을 제어하기 위해서는 manifest파일의 launchMode의 설정을 바꾸거나 Activity를 실행할 때 사용하는 Intent에 Flag 옵션을 addFlags를 통해 추가해주면 된다.
manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Standard_Week1"
tools:targetApi="31">
<activity
// android:launchMode = "(사용 할 모드)"
android:name=".LoginActivity"
android:exported="true">
</activity>
<activity
android:name=".IntroActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
과제의 manifest 파일을 열어 코드를 복사해왔다. 중간 부분부터 activity에 대한 코드가 있다. 각 액티비티별로 모드를 지정해야하기 떄문에 맞는 액티비티 코드 내부에 android:launchMode = ""를 작성하면 된다.
사용할 수 있는 launchMode는 총 5가지이며 다음과 같다.
- standard: 표준 모드이며 아무것도 작성하지 않았을 때 적용되는 기본값이다.
- singleTop: top Activity와 동일한 액티비티를 실행 시 onNewIntent()메서드를 호출해 실행중이던 Activity에 새로운 인텐트를 할당한 후 해당 Activity를 재사용한다. 그 외의경우 standard모드와 같다.
- singleTask: 해당 Activity를 root Activity로 하는 새 Task를 만들거나 기존에 존재하던 해당 Activity를 onNewIntent() 메서드를 이용해 새로운 인텐트를 할당한 후 해당 Activity 위에 있는 Activity를 모두 Destroy하고 top Activity로 만든다.
- singleInstance: 동작은 singleTask와 비슷하나 이 모드의 액티비티는 하나의 Task에 단일로 존재한다. 이 모드의 Activity 가 시작되면 해당 Activity를 root Activity면서 top Activity로 가지는 새로운 Task를 만든다. 이 Activity에서 시작하는 다른 Activity역시 새로운 Task에서 시작한다.
- singleInstancePerTask: 이 모드의 Activity는 반드시 root Activity이며 각각의 Task마다 하나의 instance만 존재할 수 있다.

Intent Flag
기능 코드 내부에서 Intent를 이용해 다음 액티비티를 시작할 때 addFlags를 통해 플래그를 추가해 제어할 수 있다.

Intent에 추가할 수 있는 플래그는 굉장히 많지만 시작모드를 정의할 수 있는 3가지가 있다.
- FLAG_ACTIVITY_NEW_TASK: 이 플래그를 추가하면 시작하는 Activity가 singleTask 모드와 동일하게 동작한다.
- FLAG_ACTIVITY_SINGLE_TOP: 이 플래그를 추가하면 시작하는 Activity가 singleTop 모드와 동일하게 동작한다.
- FLAG_ACTIVITY_CLEAR_TOP: 동일한 launchMode가 없는 플래그이며 해당 Activity가 Task 내에 실행중이라면 해당 Activity 위의 모든 Activity를 Destroy하고 onNewIntent()를 통해 새로운 인텐트를 부여한다. 이 플래그는 주로 FLAG_ACTIVITY_NEW_TASK와 함께 자주 사용된다.
'TIL > 공부' 카테고리의 다른 글
| 08/21 CS 공부 - OS(1) (0) | 2024.08.22 |
|---|---|
| 03/29 주특기 2주차 수준별 과제(3) - Fragment LifeCycle (0) | 2024.03.31 |
| 03/27 주특기 2주차 수준별 과제(1) - Activity LifeCycle (0) | 2024.03.27 |
| 03/25 0dp와 wrap_content, match_parent (0) | 2024.03.25 |
| 03/25 GuideLine과 Barrier (1) | 2024.03.25 |