OS와 앱 사이의 계약. OS가 화면 상태를 바꾸기 전에 앱에 알려 준다.
왜 필요한가
휴대폰은 데스크톱과 다르다
- 화면은 한 번에 하나
- 메모리가 빠듯해 OS 가 언제든 앱을 멈추거나 죽여야 한다
OS 가 말없이 그렇게 하면
-
카메라를 켠 채 가려지고, 다운로드가 끊기고, 화면 데이터가 사라진다
-
"내가 네 화면을 이렇게 바꿀 테니 준비/정리해라" 를 알려 주는 것이 생명주기다
동선으로 외운다
-
앱을 켠다 — onCreate → onStart → onResume
-
홈 버튼 onPause → onStop
-
다시 돌아온다 — onRestart → onStart → onResume (onCreate 는 안 불린다)
-
뒤로가기/회전 — onPause → onStop → onDestroy
-
onCreate — 일생에 한 번. 뷰 생성 · ViewModel 연결 · 한 번뿐인 초기화 onStart/Stop 보이기 시작 / 완전히 안 보임 → 보일 때만 의미 있는 자원
-
(위치 구독 · 실시간 수집) onResume/Pause 상호작용 가능 / 일부 가림
-
다이얼로그가 뜨면 onPause 까지만 가고 onStop 엔 안 간다
-
onPause는 반드시 짧아야 한다
onPause 가 끝나야 다음 화면이 그려진다
- 여기서 디스크 쓰기나 네트워크를 하면 화면 전환이 눈에 띄게 버벅인다
- 저장은 onStop 이나 코루틴으로 미룬다
짝을 맞춘다
override fun onStart() { super.onStart(); locationClient.requestUpdates(callback) }
override fun onStop() { super.onStop(); locationClient.removeUpdates(callback) }
등록/해제 · 획득/반납 · 시작/중지가 반드시 짝을 이룬다 짝을 놓치면 → 배터리 소모 · 메모리 누수 · 안 보이는 화면의 크래시
면접 함정
- ❌ "onDestroy에서 정리하면 된다" →
onDestroy는 호출이 보장되지 않는다. 프로세스가 강제 종료되면 건너뛴다. 중요한 정리는onStop까지 끝낸다. - ❌ "백그라운드로 가면 onDestroy가 불린다" →
onStop까지만 간다. 객체는 살아 있다.
상태 다이어그램으로 정리하면
onCreate ─→ onStart ─→ onResume ─→ [실행 중]
↑ ↑ │
onRestart onPause ←───────┘
↑ │
onStop ←──────┘
│
onDestroy
다른 Activity로 이동할 때의 교차 순서
-
A 에서 B 로 이동하면
- A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop
-
왜 A.onStop 이 마지막인가
- B 가 화면을 완전히 덮은 뒤에야 A 가 '안 보이는' 상태가 되기 때문
-
A.onPause 에서 무거운 일을 하면 B 의 등장이 그만큼 늦어진다
-
반대로 A.onStop 에서 자원을 정리하면 전환이 매끄럽다
onSaveInstanceState는 언제 불리나
- Android 9 이하 — onStop '전'
- Android 9 이상 — onStop '후'
어느 쪽이든 onDestroy 전이고, '앱이 죽을 수도 있는 시점' 마다 불린다 뒤로가기로 사용자가 명시적으로 닫으면 불리지 않는다 (복원할 이유가 없다)
실무에서 무엇을 어디에 두나
- onCreate — Compose setContent · ViewModel 연결 · DI 주입
- onStart — 센서·위치 구독 · 실시간 소켓 연결
- onResume — 카메라 미리보기 시작 · 애니메이션 재개
- onPause — 카메라 정지 · 애니메이션 정지 (짧게!)
- onStop — 소켓 해제 · 구독 해제 · 초안 저장
- onDestroy — 거의 아무것도 — 호출이 보장되지 않는다