안드로이드 Activity Lifecycle

2024. 11. 10. 20:12· Android
목차
  1. 1. Activity Lifecycle이란?
  2. 2. 액티비티의 상태들
  3. 3. 액티비티 생명주기 callback 함수들
  4. 4. 왜 생명주기를 알아야 하는가?

안드로이드를 열심히 공부하고는 있지만.. 안드로이드에서 기초라고 할 수 있는 Activity의 Lifecycle을 제대로 알고 있지 못하다는 생각이 들어 정리하고자 한다..!

 

안드로이드 공부를 시작한 지 얼마 되지 않았고 액티비티가 무엇인지 이해하기 시작한 개발자나, 액티비티 생명주기의 개념이 부족해 복습하고자 하는 독자라면 이 글이 도움이 될 것이다 ㅎㅎ

 

1. Activity Lifecycle이란?

Activity Lifecycle은 말 그대로 액티비티가 생성, 시작, 정지, 소멸하게 되는 순환 과정을 의미한다. 액티비티는 유저와의 상호작용 중 발생하는 여러 이벤트에 따라서 상태가 바뀌게 되는데, 액티비티가 가질 수 있는 상태(States)와 상태가 바뀔 때 호출되는 콜백 메서드들의 일련의 과정을 사이클로 나타낸 것이다. 

 

안드로이드 공식문서에서 왼쪽의 사진으로 액티비티 생명주기를 설명하고 있다. 아마도 액티비티 생명주기를 공부해 본 사람이라면 왼쪽 이미지를 지겹도록 많이 보았을 것이다. 하지만 왼쪽 이미지는 액티비티의 상태가 변경될 때 호출되는 콜백 메서드에 초점을 맞추고 있기 때문에 액티비티의 상태를 한눈에 알기는 어렵다. 따라서 오른쪽의 이미지로 액티비티 생명주기의 설명을 보충하는 것이 좋다. 오른쪽 이미지 역시 공식문서 codelab에서 제공하는 이미지이다.

 

오른쪽의 사진을 보면 액티비티는 Initialized, Created, Started, Resumed, Destroyed의 총 5개의 상태를 가지고 있음을 확인할 수 있다. 하나씩 살펴보도록 하자!

 

2. 액티비티의 상태들

1. Initialized

액티비티 객체가 생성되었고 메모리에 올라갔다.

 

2. Created

onCreate() 콜백 호출 시 이 상태로 변경된다. 데이터바인딩, ViewModel 초기화 등의 UI초기 작업을 한다. 아직 화면에 보이지는 않는다.

 

3. Started

onStart() 콜백 호출 시 이 상태로 변경된다. 액티비티가 화면에 보이기 시작한다. 하지만 아직 유저와 상호작용하지는 않는다.

추가로, 위의 이미지들을 보면 onRestart콜백도 존재하는 걸 볼 수 있다. 이에 대해선 아래에서 설명하겠다!

 

4. Resumed

onResume() 콜백 호출 시 이 상태로 변경된다. 이제 액티비티가 유저와 상호작용할 수 있다.

 

5. Destroyed

onDestroy() 콜백 호출 시 이 상태로 변경된다. 액티비티가 종료되었고, 메모리에서 해제되었다.

 

일반적으로 액티비티가 만들어지면 특정 절차가 필요 없이 바로 유저와 상호작용 할 수 있는 상태가 된다. 따라서 액티비티는 만들어지자마자 Initialized상태부터 Resumed상태까지 차례대로, 중간 단계를 거치며 한 번에 바뀌게 된다. 마치 Resumed 상태는 액티비티가 일시정지 되었다가 재시작된 상태 같지만, 실제로는 처음 생성되었을 때에도 Resumed 상태가 된다.

 

그리고 액티비티가 종료될 때도 마찬가지로 Started, Created 상태를 차례대로 거치며 Destroyed상태까지 한번에 바뀐다. 

 

만약 액티비티 위에 다른 액티비티가 생성되었거나, 홈버튼을 눌러 아예 액티비티가 보여지지 않게 되었다면 어떨까? 이 상태는 액티비티가 유저와 상호작용할 수 없는 상태이기 때문에 더 이상 Resumed 상태가 아니다. 이 경우에는 액티비티가 Created상태로 변경된다.

 

액티비티의 각 상태들은 모두 특정 콜백이 호출된 후에 변경되는데,  onCreate, onStart, onRestart, onResume, onPause, onStop, onDestroy의 총 7가지가 존재한다. 이 콜백들은 유저가 앱을 사용하면서 다양한 상황이 발생할 때, 그 상황에 해당하는 것이 호출되게 된다. 그럼 이 콜백들도 하나씩 살펴보자!!

 

3. 액티비티 생명주기 callback 함수들

콜백들을 하나씩 살펴보면서, 어떤 이벤트가 발생했을 때 호출되는지도 한번 알아보자.

 

액티비티의 생명주기를 처음 공부하는 개발자라면 위와같이 직접 액티비티의 모든 콜백 함수를 오버라이드 해서, 하나씩 로그를 찍어보고 어떤 상황에 어떤 콜백에 호출되는 지를 직접 확인하는 것이 도움이 된다.

 

1. onCreate

액티비티가 생성될 때 호출된다. 맨 처음 생성될 때에만 호출되고, 액티비티가 destroy 되거나 앱 프로세스가 종료되지 않는다면 다시 불릴 일은 없다.

 

2. onStart, onResume

액티비티가 유저와 상호작용할 수 있는 상태로 변경될 때 호출된다. 즉 액티비티 생성 시와 액티비티 재시작 시에 호출된다.

따라서 이 콜백들은 액티비티가 처음 생성되었을 때를 제외하면 아래에서 설명할 onPause, onStop 메서드가 호출된 이후에 액티비티가 재시작되면 호출되게 된다.

 

3. onRestart

이 콜백은 onStop이 호출된 후에 액티비티가 재시작 되면 호출된다. 즉 액티비티 생성 후 최초 시작 시에는 onRestart 없이 onStart와 onResume만 호출되지만, 재시작 시에는 onRestart, onStart, onResume의 순서로 세 콜백이 차례로 불린다.

 

4. onPause, onStop

액티비티가 유저와 상호작용할 수 없는 상태로 변경될 때 호출된다. onStart, onResume에서도 설명했듯 액티비티가 종료 / 일시중지 되는 상황에 호출된다고 생각하면 되겠다. 다음과 같은 상황들이 있을 수 있다.

- 홈화면으로 이동할 때.

- 액티비티 위에 다른 액티비티가 생성될 때.

- 다른 앱이 실행되었을 때 (전화 등)

- 액티비티가 종료되었을 때

- 화면 회전과 같은 구성 변경(Configuration Changed)이 일어났을 때.

 

그리고 onPause와 onStop은 호출되는 시간의 약간의 차이가 있다. onPause가 먼저 불리고 잠깐의 시간 후에 onStop이 불리게 되는데, 이 잠깐의 시간 사이에 onStop이 불리기 전에 액티비티를 재시작하게 되면 onRestart, onStart 콜백은 불리지 않고 onResume만 불리게 된다.

 

(그런데 특정 작업에서는 시간차 없이 onPause와 onStop이 동시에 불리는 경우도 있었다. 왜 이런 차이가 존재하는 지는 아직 모르겠다.. 😂)

 

5. onDestroy

액티비티가 종료될 시 호출된다. 이 때 바로 onDestroy가 호출되는 것은 아니다. 액티비티가 Resumed상태라면 Started, Created 상태를 거친 후에 Destoryed로 바뀔 수 있다. 즉 onPause, onStop이 차례대로 먼저 불린 뒤에 onDestroy가 불리게 된다.

 

단 모든 액티비티 종료 상황에 반드시 onDestroy가 불리는 것은 아니다. 사용자가 앱을 강제종료하거나, 너무 오랜 시간 앱이 백그라운드에 존재할 시 onDestroy가 불리지 않고 액티비티가 종료될 수도 있다.

 

4. 왜 생명주기를 알아야 하는가?

액티비티 생명주기를 알아두게 되면 앱 개발에 있어서 개발자가 설정할 수 있는 작업의 폭이 넓어진다. 예를 들어 액티비티가 재시작될 때 서버로부터 데이터를 다시 받아와야 한다면 어떨까? 생명주기를 알고 있다면 onResume 콜백을 오버라이드 해서 이 함수에서 해당 작업을 하면 될 것이다. 즉 유저와의 상호작용 시에 발생하는 다양한 이벤트와 이에 따라 변하는 액티비티의 상태에 맞춰서 개발자가 원하는 작업을 수행할 수 있는 것이다! 👍

 

 

저작자표시 (새창열림)
  1. 1. Activity Lifecycle이란?
  2. 2. 액티비티의 상태들
  3. 3. 액티비티 생명주기 callback 함수들
  4. 4. 왜 생명주기를 알아야 하는가?
Alsong
Alsong
Alsong
알송이의 개발 공부
Alsong
전체
오늘
어제
  • 분류 전체보기 (29)
    • Android (1)
    • PS (8)
    • 알고리즘 (1)
    • 우아한테크코스 6기 (6)
    • Kotlin (4)
    • SSAFY 11기 (1)
    • 총대마켓 프로젝트 (2)
    • 객체지향 프로그래밍 (3)
    • 회고 (0)
    • Test (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • data class
  • 우아한 테크코스 6기
  • 우아한테크코스6기
  • 백준
  • 테스트코드
  • 코틀린
  • 카카오로그인
  • 총대마켓
  • 테스트
  • 안드로이드
  • 객체지향 프로그래밍
  • 우테코 프리코스
  • DP
  • LSP
  • PS
  • 단위테스트
  • assertj
  • JUnit 5
  • 단언문
  • 우아한테크코스
  • 토큰
  • dfs
  • BOJ
  • 우테코6기
  • 우테코 6기
  • 다이나믹 프로그래밍
  • 우테코
  • 우아한 테크코스
  • 소셜로그인
  • BFS

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
Alsong
안드로이드 Activity Lifecycle
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.