본문 바로가기

Android

[Android] Activity 수명 주기(LifeCycle)

사용자의 사용에 따라서 앱의 Activity 인스턴스는 수명 주기 안에서 서로 다른 상태를 통해 전환됩니다. 앱을 종료, 탐색, 새로운 Activity 생성 등의 상태가 이에 해당합니다.

 

유튜브 통해서 동영상을 시청하고 있는 사용자가 있습니다. 사용자는 홈버튼을 눌러 앱을 잠시 벗어나게 된다면 네트워크 연결을 종료하고 동영상 재생을 멈춥니다. 그리고 유튜브를 다시 실행하면 네트워크를 재연결해서 일시 정지된 부분부터 영상이 재생되도록 할 수 있습니다. 즉, 각각의 상태에서 취해야 하는 행동을 정의함으로써 앱의 안정성에 기여합니다.

 

Activity 수명 주기(LifeCycle) 개념

활동 클래스는 원활한 Activity 전환을 위해서 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestory() 등의 6가지 콜백으로 구성된 단계를 제공합니다.

Activity 수명 주기

 

위의 그림은 각 콜백이 실행되는 순서를 그림으로 표현한 것입니다. 크게 앱이 (재)실행됐을 때앱이 일시정지 or 종료됐을 때로 구분지을 수 있습니다.

 

Activity가 실행되면 메모리 상에 해당 정보가 저장되고 실행 중인 Activity를 사용자가 벗어나면 메모리를 해제하는 단계를 거치게 됩니다. 특이한 점은 메모리를 부분적으로 해제할 수도 있습니다. 예를 들어 메모리 부족으로 인해 일시정지 중인 앱을 종료하는 경우가 해당되겠습니다. 이런 경우에 대부분의 사용자는 앱을 종료한 경험이 없기 때문에 재실행했을 때 스크롤의 위치, TextEdit 상태 등의 정보가 그대로 유지되기를 바랍니다. 여기서 메모리에 부분적으로 남아있던 정보를 활용해서 사용자가 종료한 지점에서 Activity가 다시 시작됩니다.

 

Activity 수명 주기에 대해 높은 이해를 가진다면 위와 같은 경우를 쉽게 다를 수 있게 됩니다. 그렇다고 모든 콜백을 구현할 필요는 없습니다.

 

수명 주기 콜백(Callback)

1) onCreate()

Activity가 실행되면 제일 먼저 호출되는 콜백 함수로, 반드시 구현해야 합니다. 전체 생명 주기에서 단 1번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행합니다. 예를 들어 데이터 바인딩, ViewModel과 Activity 연결, 일부 클래스 범위 변수를 인스턴스화할 수 있습니다. onCreate()의 실행이 완료되면 시스템은 onStart()를 호출하게 됩니다.

 

2) onStart()

onStart()가 실행되면 Activity가 사용자에게 표시되고, 사용자와 상호작용할 준비를 하게 됩니다. 해당 콜백은 onStop() 상태에서 Activity를 재실행 했을 때도 실행됩니다. 예를 들면 홈 화면으로 나갔다가 다시 돌아오는 상태와 같습니다. onStart()는 매우 짧은 시간에 완료되고 바로 onResume()를 호출합니다.

 

3) onResume()

이 상태로 진입하면 사용자와 상호작용하게 되고 특별한 이벤트가 발생해서 앱에서 포커스가 떠날 때(일시정지)까지 해당 상태에 머무르게 됩니다. 예를 들면 앱 사용 중에 전화가 오거나, 기기 화면이 꺼지는 등의 이벤트가 이에 해당합니다.

 

방해되는 이벤트가 발생하면 Activity는 일시정지 하고 시스템은 onPause() 콜백을 호출합니다.

 

onPause()에서 onResume()로 돌아올 때마다 구성요소를 초기화하는 등의 작업도 수행할 수 있습니다.

 

4) onPause()

콜백 함수 이름에서 알 수 있듯이 Activity가 잠시 일시 정지된 상태를 말합니다. 일시정지이므로 메모리 상에서 제거되지 않습니다. 다양한 이유로 onPause()가 실행되는데 아래는 그 예입니다.

 

  • 일부 이벤트가 앱 실행을 방해
  • 멀티 윈도우에서 실행되는 앱들 중에서 포커스를 해제당했을 때
  • 설정 Dialog 등의 대화상자가 열림

Activity가 일시정지되면 필요 없는 모든 리소스들을 해제할 수 있습니다.

 

단, onPause()를 사용해서 애플리케이션 또는 사용자 데이터를 저장, 네트워크 호출, 데이터베이스 트랜잭션을 실행해서는 안 됩니다.  onPause()가 매우 짧게 실행되기 때문에 시간이 부족하기 때문입니다. 이처럼 부하가 많이 걸리는 작업은 onStop()에서 수행해주면 됩니다.

 

5) onStop()

홈화면으로 돌아가는 등의 동작으로 Activity가 사용자에게 더 이상 보이지 않을 때 실행됩니다. 여기에서 더 이상 실행할 필요가 없는 기능들을 모두 정지할 수 있습니다. 애니메이션, GPS 연결 등이 이에 해당되겠습니다. 또한 앞서 설명한 대로 데이터베이스 트랜잭션과 같은 리소스를 많이 사용하는 작업도 수행하면 되겠습니다.

 

6) onDestroy()

onDestroy()가 호출되는 경우는 아래와 같습니다.

 

  • 사용자가 Activity를 완전히 닫거나 finish()가 호출되어 Activity가 종료되는 경우
  • 구성 변경(기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우

Activity가 종료되는 경우에 최종적으로 호출되는 콜백으로 메모리 상의 정보를 모두 제거합니다.

 

요약

콜백 설명 다음 콜백
onCreate() Activity가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨. onStart()
onStart() Activity가 사용자와 상호작용하기 직전에 호출됨. onResume()
onResume() Activity가 사용자와 상호작용하는 단계. onPause()
onPause() Activity를 일시정지 하기 위해 호출됨. onResume() 또는
onStop()
onStop() Activity가 더 이상 사용자에게 보여지지 않을 때 호출됨. 리소스를 많이 사용하는 작업을 처리하기에 적당한 콜백 onStart() 또는
onDestroy()
onDestroy() Activity가 소멸될 때 호출됨. 구성 변경 및 finish() 호출, 사용자가 Activity를 완전히 닫으면 실행. None

 

참조

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko#java 

 

활동 수명 주기에 관한 이해  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com