Android

안드로이드 Activity Lifecycle

Alsong 2024. 11. 10. 20:12

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

 

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

 

1. Activity Lifecycle이란?

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

 

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

 

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

 

2. 액티비티의 상태들

1. Initialized

액티비티가 초기화 되었지만 아직 생성되지는 않았다.

 

2. Created

onCreate() 콜백 호출 시 이 상태로 변경된다. 말 그대로 액티비티가 생성되었고, 메모리에 올라갔지만 화면에 보이지는 않는다.

 

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 콜백을 오버라이드 해서 이 함수에서 해당 작업을 하면 될 것이다. 즉 유저와의 상호작용 시에 발생하는 다양한 이벤트와 이에 따라 변하는 액티비티의 상태에 맞춰서 개발자가 원하는 작업을 수행할 수 있는 것이다! 👍