Android (안드로이드)

[Android] 액티비티 수명주기 / Activity LifeCycle

Oscar:) 2022. 8. 3. 14:49

 

지난 포스팅에서 알아보았던 4대 컴포넌트 中,

액티비티 부분에서 수명 주기를 언급했었다.

 

 

모든 액티비티는 수명 주기를 가진다.

 

말 그대로 액티비티가 태어나서 죽을 때까지의 과정이다.

Activity Life Cycle 이라는 이름은 정말 잘 지은 것 같다.

 

 

이번 포스팅에서는 액티비티 수명 주기에 대해 알아보자.

 

 

 


 

 

액티비티의 생명주기를 그림으로 표현하면 다음과 같다.

 

출처 : 안드로이드 공식 문서

 

 

위와 같이, 액티비티의 상태는 다양하다.

 

 

그리고 우리는 액티비티의 상태를 메서드로서 만나볼 수 있다.

 

곧, 액티비티의 상태 변화를 확인할 수 있는 콜백이다.

 

 

새로운 프로젝트를 생성하면,

액티비티 생성과 동시에 자동으로 onCreate() 메서드가 생성된다.

 

자동으로 추가되었다는 말은,

필수적으로 존재해야 된다는 말과 같다.

 

 

이외에도 필수적으로 작성하지는 않아도 되지만,

우리가 한 눈에 알아보고 공부하기 위해서

다른 생명주기들 또한 작성해보자.

 

위 사진에 해당하는 생명 주기를 모두 작성해 주었다.

 

 

각 생명 주기가 어떻게 흘러가는지 직접 눈으로 확인하고 싶다.

 

각 생명 주기의 메서드 안에 로그(Log)를 추가해준다.

Log 의 역할 및 사용법에 대해서는 다른 포스팅에서 더욱 자세히 다뤄보겠다.

 

우리는 Log 를 사용하여 프로세스의 상태를 확인할 수 있다.

 

이제 액티비티 생명 주기를 눈으로 확인할 준비는 끝났다.

 


 

이제 안드로이드 스튜디오 내에서 에뮬레이터로 앱을 실행해보자.

안드로이드 스튜디오 하단의 Logcat 탭에서 로그를 확인할 수 있다.

 

앱이 실행될 때

onCreate() > onStart() > onResume() 까지 진행된 것을 확인할 수 있다.

 

 

지금 까지의 상태를 생명 주기 그림으로 표현하면 다음과 같다.

앱이 실행되었고, 활동 상태에 머무르고 있다.

 


 

이제 기기의  ■ 를 터치하여 앱에서 멀어져 보겠다.

 

위와 같이 액티비티가 화면에서 멀어지거나,

홈 버튼을 눌러서 화면에서 사라져 있을 때는

 

onResume() > onPause() > onStop() 까지 진행된 것을 확인할 수 있다.

 

 

지금 까지의 상태를 생명 주기 그림으로 표현하면 다음과 같다.

액티비티가 멀어짐에 따라 onStop()에 머무르고 있다.

 


 

다시 액티비티로 돌아가 보겠다.

 

다시 액티비티로 돌아왔고,

onStop() > onRestart() > onStart() > onResume() 순으로 진행되었다.

 

 

지금 까지의 상태를 생명 주기 그림으로 표현하면 다음과 같다.

앱이 재시작되고, 활동 상태에 머무르고 있다.

 


 

이번에는 앱을 종료시켜 보겠다.

 

앱이 종료되자,

onResume() > onPause() > onStop() > onDestroy() 순으로 진행되었다.

 

 

지금 까지의 상태를 생명 주기 그림으로 표현하면 다음과 같다.

앱이 종료되었다. (shut down)

 


 

지금까지 액티비티 생명 주기의 흐름을 직접 관찰해 보았다.

 

 

지금은 하나의 액티비티만 관찰해 보았지만,

여러 액티비티가 있다고 가정하고 액티비티 간의 이동이 있을 때,
생명 주기는 어떻게 되는지 관찰해 볼 필요가 있다.

추후, 액티비티 이동에 대해 포스팅할 때 다뤄보겠다.

 

 

위에서 보다시피, 각 생명 주기는 메서드로서 만나볼 수 있고

우리는 각 메서드 안에 코드를 작성할 수 있다.

 

그리고 어떤 메서드에 어떤 코드를 작성해야 하는지,

왜 그렇게 해야 하는지 등을 생각해볼 필요가 있다.

 

 

이제, 각 생명주기에 대해 알아보자.

 

 

 

onCreate()

*Create : 생성

 

액티비티가 생성될 때 호출된다.

(액티비티의 전체 수명 기준으로 한 번만 발생한다)

 

기본으로 세팅되어야 하는 데이터들을 초기화해주는 역할을 한다.

 

 

 

onStart()

*Start : 시작

 

액티비티가 사용자에게 보여지기 직전에 호출된다.

 

 

onStart() 상태로 도착하는 경로는 다음과 같이 2가지로 생각해볼 수 있다.

onCreate()  >  onStart()

onRestart()  >  onStart()

 

 

onCreate() 상태는, 액티비티 기준으로 한 번만 실행되기 때문에

onCreate() 가 호출되지 않고 onStart() 만 호출되는 경우가 있을 것이다.

(onRestart() 경로로 onStart() 되었을 때)

 

 

강조하고 싶은 점은,

액티비티의 생성과 시작은 확실히 구분해야 한다는 것이다.

 

대부분의 데이터를 onCreate() 에서 초기화 하지만, 상황에 따라

일부는 onStart() 에서 초기화해야 될 수도 있을 것이다.

 

보통 onStart() 에서 UI 관련 데이터를 초기화하곤 한다.

 

 

 

onResume()

*Resume : 재개하다, 되다

 

액티비티가 사용자와 상호 작용이 가능해지기 직전에 호출된다.

 

즉, 액티비티가 실행중인 상태라고 볼 수 있다.

 

* 상호작용을 쉽게 이해하자면,

사용자가 액티비티 내의 어떤 요소를 터치하면

해당 요소가 동작하는 것이라 생각하면 된다.

 

 

이동할 수 있는 상태로는 onPause() 뿐이다.

(정지되었을 때)

 

따라서, 작업을 제어하는 과정에서 onPause() 와 연관지어 줄 수 있다.

(액티비티가 정지되는 중에 해제되는 요소를 초기화하는 등)

 

 

 

onPause()

*Pause : 정지하다 (일시 정지에 가까운 정지)

 

다른 액티비티가 보여질 때, 화면에서 멀어졌을 때 등 호출된다.

 

즉, 액티비티가 포커스를 잃은 상태이다.

 

 

포커스가 없는 동안 실행되지 않아도 될 요소들을 정지해준다.

 

다만, onPause() 는 아주 잠깐 실행되는 콜백이기 때문에

무거운 작업을 다루어서는 안 된다.

 

일시 중지됨에 따라 해제되는 요소를 onStop() 과 구분해 주어야 한다.

(멀티 윈도우 상태라면, 여전히 보여지는 콘텐츠에 있어서는

유지되어야 할 데이터가 있을 수 있다)

 

 

onStop()

*Stop : 정지하다

 

onPause() 다음으로 이어지며, 마찬가지로

다른 액티비티가 보여질 때, 화면에서 멀어졌을 때 등 호출된다.

 

즉, 더 이상 액티비티가 사용자에게 보여지지 않을 때 실행된다.

 

 

UI 관련 리소스 작업을 완전히 해제할 때

onPause() 보다는 onStop()을 사용한다.

 

추가적으로, onPause() 에서 다루지 못한

비교적 무거운 작업을 주로 수행한다.

 

 

 

onRestart()

*Restart : 다시 시작하다

 

액티비티가 onStop() 상태에서 다시 시작하려고 할 때 호출된다.

 

 

 

onDestroy()

*Destroy : 파괴하다

 

액티비티가 완전히 종료되었을 때 호출된다.

 

시스템에서 메모리 확보를 위해 액티비티를 제거할 때도 호출된다.

(따로 종료시켜주지 않았는데 자동으로 호출될 때도 있다)

 

 

 

 


 

 

여기까지 액티비티 생명 주기에 대해 알아보았다.

 

하지만, 모든 앱이 똑같은 구조로 짜여져 있지 않기 때문에

생명 주기의 활용에 대한 부분에 있어서는 정답이 정해져 있지는 않다.

 

따라서 개발자라면, 가장 효율적인 생명 주기의 활용에 대해서

끊임없이 생각해야 되는 부분이라고 생각한다.

 

 

액티비티의 수명 주기를 고려하여 개발하는 능력은 매우 중요하다.

물론 본인도 아직 부족하기에, 잘하고 있다고 생각하지는 않는다.

 

수명 주기를 고려하지 않고 개발을 하다보면,

분명히 만나게 되는 에러가 있을 것이다.

 

 

 

개인적인 생각이지만,

앱 개발 경험이 많아지고 많은 에러를 만날수록

수명 주기를 다루는 능력이 발전할 것 같다고 생각한다.