2025.08.18 - [CS 기초부터 한 걸음씩] - [Android] Activity와 Activity Lifecycle 기초 개념
[Android] Activity와 Activity Lifecycle 기초 개념
Activity란 무엇인가?Activity는 사용자 인터페이스가 있는 앱 컴포넌트로, 하나의 화면을 나타냅니다.쉬운 예시로 이해하기카카오톡 앱을 생각해보면:친구 목록 화면 = 하나의 Activity채팅 화면 = 또
orion-log.tistory.com
"뒤로 가기" 버튼을 눌러 앱을 종료할 때, onDestroy()가 항상 호출될 것이라 예상했지만 실제로는 그렇지 않았습니다.
테스트 기기를 바꾸며 실습하던 중 안드로이드 버전에 따라 onDestroy() 호출 차이가 있음을 확인했습니다.
따라서 Android 8.0과 Android 14.0 버전 기기에서의 결과를 바탕으로,
액티비티 생명주기 동작 방식을 분석하고, 이러한 차이가 발생하는 이유와 개발 시 주의해야 할 점을 함께 정리하고자 합니다.
각 버전별 테스트 결과
- 단일 액티비티 앱에서 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy() 로그를 찍도록 설정.
- 앱 실행 후 뒤로가기를 통해 앱 종료
- 다시 최신 앱 목록에서 앱 활성화
1. Android 8.0.0 (오레오) 버전
- 앱 실행 후 뒤로가기를 통해 앱 종료
뒤로 가기 시onPause(),onStop(),onDestroy()가 순서대로 호출되는 결과 (finish()와 유사한 동작) 확인

- 다시 최신 앱 목록에서 앱 활성화

2. Android 14 버전
- 앱 실행 후 뒤로가기를 통해 앱 종료
onPause(),onStop()만 호출되고, 대부분onDestroy()는 호출되지 않는 결과 확인- 첫 실행 시에는 뒤로가기를 할 경우
onDestroy()도 호출되는 경우 확인
- 첫 실행 시에는 뒤로가기를 할 경우

- 다시 최신 앱 목록에서 앱 활성화

onDestroy()가 즉시 호출되지 않는 이유
onDestroy()가 즉시 호출되지 않는 주된 이유는 앱 프로세스 보존 때문으로 생각됩니다.
A well-running system has multiple cached processes always available, for efficient switching between applications, and regularly kills the cached apps as needed. Only in very critical situations does the system get to a point where all cached processes are killed and it must start killing service processes.
- Processes and app lifecycle : cached process -
- 즉, 애플리케이션 간의 효율적인 전환을 위해 항상 여러 개의 캐시된 프로세스를 사용할 수 있도록 유지
- 필요에 따라 캐시된 앱을 정기적으로 종료
- 빠른 복구:
- 안드로이드 시스템은 액티비티가 뒤로 가기로 인해 화면에서 사라지더라도, onStop() 상태로 메모리에 일시적으로 보관합니다.
- 앱 다시 활성화될 경우, 액티비티를 처음부터 다시 생성할 필요가 없어(onRestart()) 앱 시작 시간이 단축됩니다.
- 리소스 보존:
- 액티비티가 메모리에 남아있는 동안, 해당 액티비티와 관련된 리소스(데이터, UI 상태 등)가 유지됩니다.
- 이는 불필요한 재로딩을 방지하여 시스템 리소스를 절약합니다.
따라서 onDestroy()는 액티비티가 명시적으로 종료될 때(finish()) 또는 시스템 메모리가 부족할 때에 시스템에 의해 호출됩니다.
개발 시 주의사항
개발자는 액티비티 생명주기를 "정확한 시점"보다 "상태의 변화"에 초점을 맞춰 이해해야 합니다.
- onDestroy()에 의존하지 않기:
중요한 데이터 저장, 리소스 해제 등의 작업은 onDestroy()가 아닌 onPause() 또는 onStop()에서 처리해야 합니다.
onDestroy()는 호출이 보장되지 않는 경우가 많으므로 신뢰할 수 없습니다.- 또 onStop()에서는 강제 종료(메모리 부족 등)을 피하기위해 메모리 리소스 해제등은 onStop()에서 실행됨
- onPause()에서 다시 onResum()으로 돌아갈 수 있으니(그래서 onPause()가 실행되는 시간이 매우 짧다고 하기도 함)
대체적으로 onStop()에서 처리함
- 재생성 시 상태 복구 고려: onStop() 상태에서 시스템에 의해 앱 프로세스가 종료될 수 있음을 항상 염두에 두어야 합니다.
참고 자료
'Code Odyssey' 카테고리의 다른 글
| Kotlin 코딩테스트 문법 시리즈 ⑰ : 타입 변환 & 확장 유틸 (1) | 2025.07.17 |
|---|---|
| Kotlin 코딩테스트 문법 시리즈 ⑯ : 널 처리 & 안전 호출 (0) | 2025.07.16 |
| Kotlin 코딩테스트 문법 시리즈 ⑮ : 람다, 수신 함수, 클로저 개념과 활용 (0) | 2025.07.15 |
| Kotlin 코딩테스트 문법 시리즈 ⑭ : 함수 패턴 정리 (3) | 2025.07.14 |
| Kotlin 코딩테스트 문법 시리즈 ⑬ : Scope Function 정리 (let, also, apply, run, takeIf) (0) | 2025.07.13 |