본문으로 바로가기


안녕하세요. PEACE-입니다.

안드로이드 스터디 [열 아홉 번째] 글입니다.


이번 포스팅은 안드로이트 4대 컴포넌트 중 액티비티 생애주기에 관한 내용을 다루겠습니다.



1. ACITIVITY

액티비티는 안드로이드 프로그래밍을 배우면서 가장 먼저 접하게되는 컴포넌트입니다. 액티비티는 주로 화면에 보이는 UI에 관한 처리를 하기 위한 요소입니다. 예를 들면 화면에 버튼을 만들고 버튼을 눌렀을 때 이벤트를 처리하는 모든 과정이 액티비티에 담겨있습니다. 하지만 이런 액티비티에 생애주기라는 중요한 사이클 존이 있습니다. 이는 액티비티의 상태에 따라 특정 메서드를 호출해 작업을 수행하며, 구조적으로 데이터를 초기화하고 삭제하여 메모리나 CPU의 부하를 줄여주는 작업을 할 수도 있습니다. 액티비티의 상태라면 어떤 것 들이 있을까요? 아래와 같은 상황이 있을 수 있습니다.

- CASE -
  사용자가 앱을 사용하는 동안 전화를 수신하여나 다른 응용 프로그램으로 전환되는 경우
  사용자가 앱을 제대로 사용하고 있지 않으면서 시스템 메모리를 소모하고 있는 경우
  사용자가 앱 실행 중에 다른 작업을 하고 오는 경우
  앱 실행 중 화면의 가로-세로 전환이 일어나는 경우



2. LIFE CYCLE

아래 그림은 안드로이드 디벨로퍼스The Activity Lifecycle 가이드에 사용된 그림을 참조한 것 입니다.




[그림 1] The Activity Lifecycle



액티비티 생애주기는 기본적으로 아래와 같은 여섯 단계의 기능이 있습니다.
onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy()

# onCraete()
액티비티를 처음 실행할 때 호출됩니다. 즉, 해당 액티비티의 수명에서 한 번만 호출되는 것입니다. 이 메서드에는 한 번만 발생해야하는 기본 로직을 담습니다. 변수 초기화나 클래스의 인스턴스화 작업을 수행하며, 예를들면 TextView 같은 위젯에 대한 id참조를 합니다.

# onStart()
onCreate()가 수행된 후에 호출되며 액티비티포그라운드로 나오기 위해 수행되는 단계입니다. UI를 관리하기 위한 코드를 작성하며 BroadcastReceiver를 등록하는 작업 등이 있습니다.

# onResume()
onStart()가 수행된 후에 호출되며 현재 실행 중인 액티비티에 포커스가 맞춰져있는 동안 onResume()의 상태를 유지합니다. 포커스가 다른 곳으로 이동되면 onResume()의 상태가 깨진다는 뜻입니다. 이는 앱 종료시 상태를 완전히 벗어나며 종료하지 않고 포커스가 다시 돌아온다면 onPause()를 거쳐 onResume()이 다시 수행될 수 있습니다.

# onPause()
액티비티의 포커스가 다른 곳으로 이동했을 때 호출됩니다. 이 상황은 앱을 종료하는 것 뿐만 아니라 일시적인 포커스 이동에도 수행을 거치는 단계입니다. 이는 액티비티가 백그라운드에 있다는 뜻이며, 앱 개발자가 상황에 따라 메모리나 배터리 소모를 일으키는 자원을 해제하는 로직을 구현할 수 있습니다. 하지만 onPause()는 매우 짧은 시간을 거쳐 수행되기 때문에 무거운 작업을 수행한다면 작업을 완료할 수 없습니다. 주로 이 문제를 해결하기 위해 onStop()을 이용합니다.
- 앱이 종료되지 않고 액티비티의 활동이 재개되는 경우 onResume()을 재실행 하기 위한 순환이 일어납니다.

# onStop()
onPuase()의 다음 단계로 액티비티가 사용자에게 보이지 않거나 활동이 일어나지 않는 상태를 의미합니다. 사용자가 사용하지 않는 대부분의 자원을 해제해야합니다.
- 앱이 종료되지 않고 액티비티의 활동이 재개되는 경우 onStart()의 재실행을 위한 순환이 일어나며 onRestar()를 거쳐 onStart()가 실행됩니다.

# onDestroy()
앱이 종료되기 위한 최종 단계로 종료 직전 앱의 모든 리소스(자원)을 해제하고 합니다.



3. 수행 테스트

1. 앱 실행 (액티비티 호출) : onCreate() -> onStart() -> onResume()
2. 액티비비1에서 인텐트로 액티비티2를 띄웠을 때
액티비티1 관점 : onPause() -> onStop()
액티비티2 관점 : onCreate() -> onStart() -> onResume()
3. 액티비티2를 종료하고 1으로 돌아왔을 때 : onRestart() -> onStart() -> onResume()
4. 홈키를 눌러 앱이 백그라운드로 전환됐을 때 : onPuase() -> onStop()
5. 다시 돌아왔을 때 : onRestart() -> onStart() -> onResume()
6. 앱을 종료할 때 : onPuase() -> onStop() -> onDestroy()