📌 Intro
안드로이드 시스템은 실행되는 앱의 상태를 직접 관리한다. 만약 앱이 시스템에 의해 관리되지 않으면, 실행된 앱이 메모리를 과도하게 점유하거나 화면을 보여주는 권한을 과도하게 갖기 때문에 다른 기능을 사용하지 못할 수도 있기 때문이다. 이는 대부분의 모바일 OS에서 사용하는 방법이다.
액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 실행과 중지, 메모리에서 해제되는 여러 과정을 상태 정보로 가지고 있고, 이런 상태 정보는 시스템이 관리하면서 각각의 상태에 해당하는 메서드를 자동으로 호출한다. 이에 대해 자세히 알아보자.
📌 액티비티 수명주기
대표적인 액티비티의 상태 정보는 다음과 같다.
- 실행
화면상에 액티비티가 보이면서 실행되어 있는 상태.
액티비티 스택의 최상위에 있으며 포커스를 가지고 있다.
- 일시 정지
사용자에게 보이지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태.
대화상자가 위에 있어 일부가 가려진 경우에 해당한다.
- 중지
다른 액티비티에 의해 완전히 가려져 보이지 않는 상태
액티비티의 상태 정보가 변하는 것을 액티비티의 수명주기라고 하고 액티비티가 처음 만들어진 후 없어질 때까지 상태가 변하면서 각각에 해당하는 메서드가 자동으로 호출된다. 위 그림은 액티비티의 수명주기와 메서드를 그림으로 표현한 것이다.
그림에서도 볼 수 있듯이 새로운 액티비티가 생성되면 onCreate(), onStart(), onResume() 메서드가 차례대로 호출된 뒤에 화면이 보이게 된다. 또, 액티비티가 메모리에서 없어지는 경우에는 onDestroy() 메서드가 호출된다.
📌 상태 메서드
다음은 각각의 상태 메서드에 대한 자세한 설명이다.
- onCreate()
액티비티가 처음에 만들어질 때 호출된다.
화면에 보이는 뷰들의 일반적인 상태를 설정한다.
이 메서드 다음에는 항상 onStart() 메서드가 호출된다.
- onStart() 액티비티가 화면에 보이기 직전에 호출된다.
액티비티가 화면에 보이게 되면 이 메서드 다음으로 onResume() 메서드가 호출된다.
액티비티가 화면에서 가려지게 되면 이 메서드 다음에 onStop() 메서드가 호출된다.
- onResume() 액티비티가 사용자와 상호작용하기 바로 직전에 호출된다.
- onRestart() 액티비티가 중지된 이후에 호출되는 메서드로 다시 시작되기 직전에 호출된다.
이 메서드 다음에는 항상 onStart() 메서드가 호출된다.
- onPause() 또 다른 액티비티를 시작하려고 할 때 호출된다.
저장하지 않은 데이터를 저장소에 저장하거나 애니메이션 작업을 중지하는 등의 기능을 수행하는 메서드다.
이 메서드가 리턴하기 전에는 다음 액티비티가 시작될 수 없기 때문에 이 작업은 매우 빨리 수행된 후 리턴되어야 한다.
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 없다.
- onStop() 액티비티가 사용자에게 보이지 않을 때 호출된다.
액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출된다.
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 없다.
- onDestroy() 액티비티가 소멸되어 없어지기 전에 호출된다.
이 메서드는 액티비티가 받는 마지막 호출이다.
액티비티가 앱에 의해 종료되거나(finish() 메서드) 시스템이 강제로 종료시키는 경우에 호출될 수 있다.
위 수명주기 메서드가 실행되는 순서는 위 그림과 같다.
만약 사용자가 앱에서 작업을 진행하다가 갑자기 전화가 왔을 때 전화가 끝난 이후에도 앱의 직전 상태로 돌아가야 한다. 이 때 사용되는 액티비티의 수명주기 메서드는 onPause()와 onResume()이다. 이 두 메서드는 앱이 멈추거나 없어질 때 그리고 앱이 다시 보이거나 새로 실행될 때 호출되기 때문에 이를 구현하여 앱의 상태를 저장하거나 복원해야 한다.
📌 참고
[1] Do it! 안드로이드 앱 프로그래밍 8판