[Android] Activity와 Activity Lifecycle 기초 개념

2025. 8. 18. 22:50·CS 기초부터 한 걸음씩

Activity란 무엇인가?

Activity는 사용자 인터페이스가 있는 앱 컴포넌트로, 하나의 화면을 나타냅니다.

쉬운 예시로 이해하기

  • 카카오톡 앱을 생각해보면:
    • 친구 목록 화면 = 하나의 Activity
    • 채팅 화면 = 또 다른 Activity
    • 설정 화면 = 또 다른 Activity
  • 각각이 별개의 Activity이고, 화면을 터치해서 이동할 때마다 다른 Activity로 전환되는 것입니다.

Activity의 특징

  1. 하나의 Activity = 하나의 화면
  2. 여러 Activity가 모여서 하나의 앱을 구성
  3. 사용자가 수행하는 특정 작업에 중점을 둠 (예: 이메일 읽기, 사진 찍기, 지도 보기)

Activity Lifecycle이란?

Lifecycle의 의미

Lifecycle은 우리말로 '생명주기'라는 뜻입니다.

  • 사람이 태어나서 → 자라서 → 죽는 것처럼
  • Activity도 생성되어서 → 사용되다가 → 사라지는 과정이 있습니다.

왜 Activity Lifecycle이 중요한가?

안드로이드에서는 다음과 같은 상황들이 자주 발생합니다:

  • 전화가 걸려오면 → 현재 앱이 뒤로 숨겨짐
  • 홈 버튼을 누르면 → 현재 앱이 뒤로 숨겨짐
  • 다른 앱으로 이동하면 → 현재 앱이 뒤로 숨겨짐
  • 기기를 회전하면 → 현재 화면이 다시 그려짐

이런 상황마다 Activity가 어떻게 반응해야 하는지 정해놓은 것이 Activity Lifecycle입니다.

활동 수명 주기를 간략하게 표현한 그림 https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko

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() → [앱 사용 중]

앱 처음 실행 중 log

전화가 걸려와서 앱이 뒤로 숨겨질 때 (백그라운드 전환 / 앱 비활성화)

[앱 사용 중] → onPause() → onStop() → [전화 통화 중]

백그라운드 전환 중 log

전화가 끝나고 다시 앱으로 돌아올 때 (포그라운드 전환 / 앱 활성화)

[전화 끝] → onRestart() → onStart() → onResume() → [앱 사용 중]

포그라운드 전환 중 log

앱 구성을 변경할 때 (화면 회전)

[앱 사용 중] → onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume() → [앱 새로운 화면]

구성 변경 중 log

앱을 완전히 종료할 때

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

최근 앱 목록에서 스와이프로 강제종료 중 log

실제 예시: 음악 앱으로 이해하기

음악을 듣고 있는 상황을 생각해보면:

  1. onCreate(): 음악 앱이 시작되면서 화면이 만들어짐
  2. onStart(): 음악 앱 화면이 보이기 시작
  3. onResume(): 사용자가 버튼을 누를 수 있는 상태가 됨
  4. onPause(): 전화가 걸려오면 음악 앱이 뒤로 밀려남 (하지만 음악은 계속 재생_물론 멈추는게 일반적임)
  5. onStop(): 다른 앱으로 완전히 이동 (음악은 백그라운드에서 계속 재생될 수 있음)
  6. onDestroy(): 음악 앱을 완전히 종료하면 음악도 멈춤

안드로이드 용어 정리

포그라운드 (Foreground)

  • 의미: 현재 화면에 보이면서 사용자와 상호작용하는 상태
  • 예시: 지금 카카오톡으로 메시지를 보내고 있다면, 카카오톡이 포그라운드에 있는 것

백그라운드 (Background)

  • 의미: 화면에 보이지 않지만 메모리에서 실행되고 있는 상태
  • 예시: 음악을 들으면서 다른 앱을 사용할 때, 음악 앱은 백그라운드에 있는 것

Bundle

  • 의미: 데이터를 담는 상자 같은 것
  • 예시: 게임에서 현재 점수나 레벨을 임시로 저장해두는 곳

구성 변경 (Configuration Change)

  • 의미: 화면 회전, 언어 변경 등으로 화면이 다시 그려져야 하는 상황
  • 예시: 휴대폰을 세로에서 가로로 돌릴 때

활용

  1. 사용자 경험: 전화가 와도 앱이 멈추지 않게 하려면
  2. 배터리 절약: 안 보이는 화면에서는 불필요한 작업을 멈춰야 함
  3. 메모리 관리: 안드로이드가 메모리 부족할 때 앱을 강제로 종료할 수 있음
  4. 데이터 보존: 앱이 갑자기 종료되어도 중요한 데이터는 잃지 않도록

참고 자료

  • Android Developers - Activity 소개
  • Android Developers - Activity API reference
  • Android Developers - Activity 수명 주기
  • Android Developers - Lifecycle.Event API reference
  • Android Developers  - Processes and app lifecycle

'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
'CS 기초부터 한 걸음씩' 카테고리의 다른 글
  • [Android] 안드로이드 앱 구조 정리
  • [Android] Android Studio Logcat과 로그 레벨
  • word2vec 이란? - 분포 가설부터 학습 알고리즘까지
  • 벡터 임베딩 - 비정형 데이터를 수치로 표현하는 방법
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    코테
    알고리즘고득점kit
    greedy
    문법정리
    Level3
    Level2
    java
    Kotlin
    시뮬레이션
    boostcamp
    백준
    프로그래머스
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[Android] Activity와 Activity Lifecycle 기초 개념
상단으로

티스토리툴바