Activity란 무엇인가?
Activity는 사용자 인터페이스가 있는 앱 컴포넌트로, 하나의 화면을 나타냅니다.
쉬운 예시로 이해하기
- 카카오톡 앱을 생각해보면:
- 친구 목록 화면 = 하나의 Activity
- 채팅 화면 = 또 다른 Activity
- 설정 화면 = 또 다른 Activity
- 각각이 별개의 Activity이고, 화면을 터치해서 이동할 때마다 다른 Activity로 전환되는 것입니다.
Activity의 특징
- 하나의 Activity = 하나의 화면
- 여러 Activity가 모여서 하나의 앱을 구성
- 사용자가 수행하는 특정 작업에 중점을 둠 (예: 이메일 읽기, 사진 찍기, 지도 보기)
Activity Lifecycle이란?
Lifecycle의 의미
Lifecycle은 우리말로 '생명주기'라는 뜻입니다.
- 사람이 태어나서 → 자라서 → 죽는 것처럼
- Activity도 생성되어서 → 사용되다가 → 사라지는 과정이 있습니다.
왜 Activity Lifecycle이 중요한가?
안드로이드에서는 다음과 같은 상황들이 자주 발생합니다:
- 전화가 걸려오면 → 현재 앱이 뒤로 숨겨짐
- 홈 버튼을 누르면 → 현재 앱이 뒤로 숨겨짐
- 다른 앱으로 이동하면 → 현재 앱이 뒤로 숨겨짐
- 기기를 회전하면 → 현재 화면이 다시 그려짐
이런 상황마다 Activity가 어떻게 반응해야 하는지 정해놓은 것이 Activity Lifecycle입니다.

Activity Lifecycle의 6가지 상태
1. onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // 화면 모양 설정
}
호출 시점: Activity가 생성될 때 (필수 콜백)
수신 이벤트: ON_CREATE
트리거 이벤트:
- 앱이 처음 시작될 때
- 구성 변경(화면 회전 등)으로 Activity가 재생성될 때
수행 작업:
- setContentView()로 UI 레이아웃 설정
- 멤버 변수 초기화
- 전체 생명주기 동안 한 번만 수행되는 기본 설정
- savedInstanceState를 통한 이전 상태 복원
2. onStart()
override fun onStart() {
super.onStart()
}
호출 시점: Activity가 Started 상태에 진입할 때
수신 이벤트: ON_START
트리거 이벤트:
- onCreate() 직후
- onRestart() 직후 (백그라운드에서 다시 포그라운드로 올 때)
수행 작업:
- Activity가 사용자에게 표시되기 직전 준비 작업
- UI 관련 초기화 코드
3. onResume()
override fun onResume() {
super.onResume()
}
호출 시점: Activity가 Resumed 상태에 진입할 때 (사용자 상호작용 가능)
수신 이벤트: ON_RESUME
트리거 이벤트:
- onStart() 직후
- onPause()에서 다시 포그라운드로 돌아올 때
수행 작업:
- 포그라운드에서 실행되어야 하는 기능 활성화
- 애니메이션 시작, 카메라 접근, 센서 리스너 등록
- 사용자 입력 이벤트 처리 준비
4. onPause() - 일시 정지
override fun onPause() {
super.onPause()
}
호출 시점: Activity가 Paused 상태에 진입할 때
수신 이벤트: ON_PAUSE
트리거 이벤트:
- 다른 Activity가 시작되어 현재 Activity를 부분적으로 가릴 때
- 멀티 윈도우 모드에서 포커스를 잃을 때
- 시스템 대화상자나 반투명 Activity가 위에 올라올 때
수행 작업:
- 포그라운드에서 실행되어서는 안 되는 기능 일시중지
- 카메라 해제, 애니메이션 중지, 센서 리스너 해제
- 중요: 무거운 종료 작업 금지 (다음 Activity 시작 지연 방지)
5. onStop() - 정지
override fun onStop() {
super.onStop()
}
호출 시점: Activity가 Stopped 상태에 진입할 때
수신 이벤트: ON_STOP
트리거 이벤트:
- 다른 Activity가 시작되어 현재 Activity를 완전히 가릴 때
- 홈 버튼 또는 최근 앱 버튼으로 다른 앱으로 이동할 때
수행 작업:
- 사용자에게 보이지 않는 동안 불필요한 리소스 해제
- CPU 집약적인 종료 작업 수행
- 데이터베이스에 정보 저장
- 네트워크 호출 중단
6. onDestroy() - 소멸
override fun onDestroy() {
super.onDestroy()
}
호출 시점: Activity가 완전히 소멸되기 전
수신 이벤트: ON_DESTROY
트리거 이벤트:
- finish() 메서드 호출로 Activity 종료
- 구성 변경으로 인한 Activity 재생성
- 시스템이 메모리 확보를 위해 Activity 종료
수행 작업:
- 이전 콜백에서 해제되지 않은 모든 리소스 정리
- 브로드캐스트 리시버, 서비스, 타이머 등 해제
- 메모리 누수 방지를 위한 최종 정리
헷갈리는 개념 차이 정리
onPause(), onStop(), onDestroy()의 차이
| 콜백 메서드 | 상태 | 주요 역할 |
|---|---|---|
onPause() |
부분적으로 가려짐 (Partial Visibility) | 빠르고 가벼운 작업 (예: 게임 일시 정지) |
onStop() |
완전히 가려짐 (No Visibility) | 무거운 작업 (예: 데이터베이스 저장, 불필요한 네트워크 연결 해제) |
onDestroy() |
소멸 (Destroyed) | 액티비티 최종 정리 (예: 백그라운드 스레드 종료) |
강제 종료(Process Kill) vs onDestroy()
onDestroy()
onDestroy()는 특정 컴포넌트(액티비티, 서비스 등)의 생명주기가 끝났을 때 호출되는 콜백 메서드입니다.
- 호출되는 경우:
finish()메서드 호출 등으로 액티비티를 종료할 때. - 영향 범위:
onDestroy()가 호출된다고 해서 앱 전체 프로세스가 종료되는 것은 아닙니다.- 다른 액티비티나 서비스가 여전히 실행 중일 수 있습니다.
강제 종료 (Process Kill)
강제 종료는 안드로이드 시스템이 앱 프로세스 전체를 메모리에서 제거하는 것을 의미합니다.
이 경우 앱과 관련된 모든 컴포넌트(액티비티, 서비스 등)가 함께 소멸됩니다.
- 호출되는 경우:
- 사용자가 최근 앱 목록에서 앱을 스와이프하거나, 설정에서 '강제 중지'를 선택했을 때.
- 시스템 메모리가 부족하여 백그라운드에서 실행 중인 앱을 정리할 때.
- 영향 범위: 앱의 모든 데이터와 상태가 메모리에서 사라집니다.
즉, onDestroy()는 특정 액티비티나 서비스의 소멸을 알리는 반면, 강제 종료는 앱 전체가 소멸되는 것을 의미합니다.
싱글턴 데이터는 onDestroy() 후에도 남아 있지만, 강제 종료 시에는 함께 사라집니다.
액티비티 생명주기 /= 앱 생명주기
참고
- 강제 종료시
onDestory()가 실행될 수도 있고, 안 될 수도 있다. - 강제 종료 상황에서 onDestroy()가 호출되지 않는다고 가정하고 코드를 작성하는 것이 안전
Activity Lifecycle의 추가 콜백
onRestart() - "다시 시작 준비"
override fun onRestart() {
super.onRestart()
}
호출 시점: Stopped 상태의 Activity가 다시 시작되기 직전
트리거 이벤트:
- 백그라운드에 있던 Activity가 다시 포그라운드로 올 때
- 다른 앱에서 다시 우리 앱으로 돌아올 때
수행 작업:
- onStart() 호출 직전에 실행되는 준비 작업
- 백그라운드에 있는 동안 변경된 상태 업데이트
onSaveInstanceState() - "상태 저장"
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("user_data", userData)
}
호출 시점: Activity가 소멸될 가능성이 있을 때 (onStop() 전후)
트리거 이벤트:
- 구성 변경 (화면 회전, 언어 변경 등)
- 시스템이 메모리 부족으로 Activity를 종료할 가능성이 있을 때
- 홈 버튼이나 최근 앱 버튼을 눌렀을 때
수행 작업:
- 임시적으로 잃을 수 있는 UI 상태나 사용자 데이터 저장
- Bundle 객체에 key-value 형태로 데이터 저장
onRestoreInstanceState() - "상태 복원"
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
userData = savedInstanceState.getString("user_data", "")
}
호출 시점: onCreate() 후, onStart() 후에 호출 (onResume() 전)
트리거 이벤트:
- 이전에 onSaveInstanceState()로 저장된 상태가 있을 때
- Activity가 재생성되면서 이전 상태를 복원해야 할 때
수행 작업:
- onSaveInstanceState()에서 저장했던 데이터 복원
- UI 상태나 사용자 입력 데이터 복구
흐름 정리
이벤트는 누가 보내고 누가 받나?
보내는 쪽: 안드로이드 시스템
- 안드로이드 프레임워크가 lifecycle 이벤트(
Lifecycle.Event)를 관리 - 사용자 행동이나 시스템 변화를 감지하면 이벤트 발송
받는 쪽: 우리가 만든 Activity
- Activity 클래스가 이벤트를 수신
- 해당하는 콜백 메서드 자동 실행
앱을 처음 실행할 때
앱 시작 → onCreate() → onStart() → onResume() → [앱 사용 중]

전화가 걸려와서 앱이 뒤로 숨겨질 때 (백그라운드 전환 / 앱 비활성화)
[앱 사용 중] → onPause() → onStop() → [전화 통화 중]

전화가 끝나고 다시 앱으로 돌아올 때 (포그라운드 전환 / 앱 활성화)
[전화 끝] → onRestart() → onStart() → onResume() → [앱 사용 중]

앱 구성을 변경할 때 (화면 회전)
[앱 사용 중] → onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume() → [앱 새로운 화면]

앱을 완전히 종료할 때
- 간혹 뒤로가기만 해도 onDestroy() 가 동작하나, 대부분 백그라운드에 남아 있기에 onDestroy()는 호출되지 않을 수 있습니다. - 참고
- 현재 테스트에선 최근 앱 목록에서 앱을 스와이프하여 강제 종료하였습니다.
(강제 종료 시에도 onDestroy()가 동작하지 않을 수 있음)
[앱 사용 중] → onPause() → onStop() → onDestroy() → [앱 종료]

실제 예시: 음악 앱으로 이해하기
음악을 듣고 있는 상황을 생각해보면:
- onCreate(): 음악 앱이 시작되면서 화면이 만들어짐
- onStart(): 음악 앱 화면이 보이기 시작
- onResume(): 사용자가 버튼을 누를 수 있는 상태가 됨
- onPause(): 전화가 걸려오면 음악 앱이 뒤로 밀려남 (하지만 음악은 계속 재생_물론 멈추는게 일반적임)
- onStop(): 다른 앱으로 완전히 이동 (음악은 백그라운드에서 계속 재생될 수 있음)
- onDestroy(): 음악 앱을 완전히 종료하면 음악도 멈춤
안드로이드 용어 정리
포그라운드 (Foreground)
- 의미: 현재 화면에 보이면서 사용자와 상호작용하는 상태
- 예시: 지금 카카오톡으로 메시지를 보내고 있다면, 카카오톡이 포그라운드에 있는 것
백그라운드 (Background)
- 의미: 화면에 보이지 않지만 메모리에서 실행되고 있는 상태
- 예시: 음악을 들으면서 다른 앱을 사용할 때, 음악 앱은 백그라운드에 있는 것
Bundle
- 의미: 데이터를 담는 상자 같은 것
- 예시: 게임에서 현재 점수나 레벨을 임시로 저장해두는 곳
구성 변경 (Configuration Change)
- 의미: 화면 회전, 언어 변경 등으로 화면이 다시 그려져야 하는 상황
- 예시: 휴대폰을 세로에서 가로로 돌릴 때
활용
- 사용자 경험: 전화가 와도 앱이 멈추지 않게 하려면
- 배터리 절약: 안 보이는 화면에서는 불필요한 작업을 멈춰야 함
- 메모리 관리: 안드로이드가 메모리 부족할 때 앱을 강제로 종료할 수 있음
- 데이터 보존: 앱이 갑자기 종료되어도 중요한 데이터는 잃지 않도록
참고 자료
'CS 기초부터 한 걸음씩' 카테고리의 다른 글
| [Android] 안드로이드 앱 구조 정리 (1) | 2025.08.19 |
|---|---|
| [Android] Android Studio Logcat과 로그 레벨 (3) | 2025.08.18 |
| word2vec 이란? - 분포 가설부터 학습 알고리즘까지 (4) | 2025.08.04 |
| 벡터 임베딩 - 비정형 데이터를 수치로 표현하는 방법 (3) | 2025.08.04 |
| 함수형 프로그래밍 6편 - 함수형 사고 방식과 문제 해결 전략 (1) | 2025.07.23 |