이전 포스팅
https://androidhelper.tistory.com/49
[Android] 가볍게 시작하는 Android Task
이전에 fragment Manager에 대해 알아보면서 간단하게 백 스택 구조에 대해 알아본 적이 있다. https://androidhelper.tistory.com/28 [Android] Fragment Manager, Basic 편일반적으로 운영 애플리케이션 담당 업무를 하
androidhelper.tistory.com
Multiple activity instances
back stack의 Activity는 기본적으로 재배치 되지 않는다.
그렇기 때문에 앱에서 사용자가 특정 Activity를 여러 Activity에서 시작할 경우, 이전 인스턴스를 맨 위로 가져오는 대신 해당 Activity의 새 인스턴스가 생성되어 스택에 추가된다.
즉, 앱의 한 액티비티가 서로 다른 태스크에서조차 여러 번 인스턴스화될 수 있는 것이다.

사용자가 뒤로 가기 버튼이나 제스처를 사용하여 뒤로 이동하면, Activity 인스턴스가 열린 순서대로 표시되며,
각 인스턴스는 고유한 UI 상태를 갖고 있기 때문에 해당 상태가 복원된다.
Activity와 Task의 생명주기 요약, Activity의 상태
- Activity A가 Activity B를 시작하면 Activity A는 정지되지만 스크롤 위치나 입력된 텍스트와 같은 상태는 유지된다.
- 사용자가 Activity B에서 탭하거나 뒤로 가기 제스처를 사용하면 Activity A가 복원된 상태로 다시 시작된다.
- 사용자가 홈 버튼이나 제스처를 사용하여 Task을 종료하면 현재 Activity가 중지되고 해당 Task는 백그라운드로 이동한다.
- 시스템은 Task에 포함된 모든 Activity의 상태를 유지한다.
- 사용자가 나중에 Task를 시작했던 실행 아이콘을 선택하여 작업을 다시 시작하면 Task가 포그라운드로 돌아와 스택의 최상단에서 Activity를 재개한다.
- 사용자가 뒤로 가기 버튼을 탭하거나 제스처를 취하면 현재 Activity가 스택에서 제거되고 종료된다.
- 스택에 있던 이전 Activity가 다시 시작된다.
- Activity가 종료될 때 시스템은 해당 Activity의 상태를 유지 하지 않는다.
- 루트 런처 활동의 경우 , 앱이 Android 12 이상 버전의 기기에서 실행될 때 동작 방식이 다르다
- Activity는 다른 Task에서도 여러 번 인스턴스화될 수 있다.
루트 런처 활동의 경우 , 앱이 Android 12 이상 버전의 기기에서 실행될 때
동작 방식이 다릅니다
Root Launcher Activity에서 Android 12 이상에서의 백탭 동작 차이
루터 런처(root launcher) Activity란, `intendent filter`에 ACTION_MAIN, CATEGORY_LAUNCHER를 모두 선언한 Activity이다.
이러한 Activity는 앱 런처에서 앱으로 진입하는 진입점 역할을 하며 작업(Task)을 시작하는 데 사용된다는 점에서 특별하다.
루트 런처 Activity에서 사용자가 뒤로 가기 버튼을 탭하거나 제스처를 취하면, 시스템은 기기에서 실행 중인 안드로이드 버전에 따라 해당 이벤트를 다르게 처리한다.
Android 11 이하 버전에서의 시스템 동작
시스템에서 Task를 종료시킨다.
Android 12 이상 시스템 동작
Activity를 종료하지 않고, Activity와 Task를 백그라운드로 전환시킨다.
이러한 동작은 홈 버튼이나 제스처를 사용하여 앱에서 나갈 때의 기본 시스템 동작과 동일하다.
대부분의 경우, 이러한 동작은 사용자가 앱을 완전히 종료된 상태에서 다시 시작하는 대신, 실행 중인 상태에서 더 빠르게 앱을 재개할 수 있게 되는 것이다.
이러한 동작 차이 때문에, 사용자 지정 뒤로 가기 기능을 제공해야 하는 경우 onBackPressed()를 오버라이딩하는 것 보다 AndroidX 액티비티 API를 사용하는 것을 권장한다.
AndroidX Activity API는 Back 이벤트를 가로채는 컴포넌트가 없으면, 해당 Android 버전에 맞는 기본 시스템 동작으로 자동 위임할 수 있게 처리한다.
onBackPressed 같은 비권장 로직
override fun onBackPressed() {
finish()
}
AndroidX API
onBackPressedDispatcher.addCallback(...)
BackHandler { }
만약, 앱이 onBackPressed()를 오버라이드해서 Back 처리 후 Activity를 종료하고 있다면, finish()를 호출하지 말고 super.onBackPressed()를 호출하도록 수정해야한다.
즉, 이제 backPressed의 기본 동작이 finish()가 아니기 때문에, 버전 동작을 대응하기 위해서는 backPressed를 오버라이디하여 개발한 개발자들 중 커스텀 한 back 동작 외를 처리할 때 finish()를 한 경우 super.를 호출하도록 수정해줘야한다는 것이다.
예를 들어, 어떤 UI가 보인 상태에서 뒤로가기 하면 UI가 안 보이게 처리하고, UI가 안 보인 상태에서 뒤로 갈 경우 해당 Activitiy를 종료 시키는 로직을 위해 onBackPressed()를 오버라이딩 했다면, UI가 안 보인 상태에서 finish()를 호출하는 것이 아닌 super.를 호출해주어야하는 것이다.
Multi-window 환경
Android 7.0(API 레벨 24) 이상에서 지원되는 멀티 윈도우 환경에서 앱이 동시에 실행될 때,
시스템은 각 창에 대해 Task을 개별적으로 관리한다.
각 창에는 여러 Task가 포함될 수 있다. 시스템은 창 단위로 Task 또는 Task 그룹을 관리한다.
- 분활 하면 모드
- 화면 속 화면 모드
- 데스트톱 창 모드
사용자가 특정 Activity를 여러 Activity에서 시작할 경우, 이전 인스턴스를 맨 위로 가져오는 대신 해당 Activity의 새 인스턴스가 생성되어 스택에 추가
Android 기본 동작에서는 모든 Activity를 동일한 Task에 배치하여 백 스택을 관리한다. 이는 후입선출(LIFO) 방식의 방식이다.
대부분의 앱에서는, Activity가 Task와 어떻게 연결되는지 또는 백 스택에서 어떤 위치에 존재하는지에 대해 신경 쓸 필요가 없다.
하지만 경우에 따라 일반적인 동작을 변경해야 할 수도 있다.
예를 들어, 앱 내 Activity가 시작될 때 현재 Task가 아닌 새 Task에서 실행하거나,
Activity를 시작할 때 새 인스턴스를 생성하는 대신 기존 인스턴스를 가져와 백스택 상단에 배치 하거나,
또는 사용자가 Task를 떠날 때 루트 액티비티를 제외한 모든 Activity가 백 스택에서 제거되도록 할 수도 있다.
이는 하기 두가지의 방식으로 커스텀이 가능하다
- <activity> manifest 요소
- startActivity() 속성에 전달하는 intent flag
⚠️ 주의: 대부분의 앱은 Activity 및 Task의 기본 동작을 변경하지 않는다.
Activity의 기본 동작을 수정해야 하는 경우, 신중하게 접근하여 Activity 실행 시 및 다른 Activity나 Task에서 뒤로 가기 버튼 또는 제스처를 사용하여 해당 Activity로 돌아올 때의 사용성을 테스트해야 한다.
또한 사용자의 기대와 충돌할 수 있는 탐색 동작(navigation)이 있는지도 테스트해야 한다.
관련된 <activity>주요 속성
- taskAffinity
- launchMode
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
관련된 주요 intent 플래그
다음 포스팅에서는 이러한 Manifest 속성과 intent 플래그를 사용하여,
Activity가 Task와 연결되는 방식과 백 스택에서 동작하는 방식을 설명하고자 한다.
그것과 같이 최근 활동 화면에서 Task과 Activity이 표시되고 관리되는 방식에 대한 고려 사항도 확인해보면 좋을 것 같다.
일반적으로 시스템에서 최근 활동 화면에 작업과 Activity가 표시되는 방식이 정의되어 있으므로, 이 동작을 수정할 필요는 없다.
추가적으로 알아봐야 하는 부분
- Launch Mode
- 관련된 Manifest 속성
- 관련된 intent flag
- 최근 활동 화면
추가적으로 알아보면 좋을 부분
- Design navigation graphs
- onBackPressed()를 오버라이딩하는 것 보다 AndroidX 액티비티 API를 사용하는 것을 권장하는 보다 구체적인 이유
참고 자료
'Android > 학습' 카테고리의 다른 글
| [Android] 가볍게 시작하는 Android Task (1) | 2026.05.30 |
|---|---|
| [Git] Git tag란, 만약 tag된 commit이 merge 된다면? (0) | 2026.05.05 |
| [Android] 실전 예제로 보는 MVP Pattern의 장단점 (0) | 2026.04.12 |
| [Android] Android 16 (target SDK 36) 대응 (0) | 2026.03.14 |
| [Android] targetSdk와 compileSdk의 차이, 그에 따른 영향. (0) | 2026.02.22 |