액티비티와 서비스는 생명 주기 흐름을 따라 생성되고 동작하고 종료됩니다. 따라서 생명주기를 알아야 합니다. 이번 연재에서는 액티비티와 서비스 각각의 생명 주기를 2회에 걸쳐 소개합니다.
—–
① 액티비티 생명 주기
액티비티는 화면의 기본 구성 단위입니다. 액티비티는 여러분이 만든 UI를 보여주고, 터치, 드래그, 키보드 입력과 같은 여러 상호작용을 제공합니다. 액티비티를 작동시키려면 액티비티의 생명 주기를 알아보겠습니다.
사람도 태어나서 죽을 때까지 유아기, 청년기, 노년기를 거치듯이 액티비티 역시 마찬가지입니다. 우리가 태어나자마자 어른처럼 뛰어다닐 수 없듯이 액티비티도 각 상태마다 할 수 있는 행동, 해야 하는 행동이 다릅니다.
인간은 시간이 지나면 자연스럽게 커가지만, 액티비티는 사용자의 활동에 따라 새로운 상태에 들어갑니다. 그리고 그 상태에 들어가면 시스템은 미리 정의된 콜백 함수를 실행합니다. 이를 그림으로 간단히 표현하면 다음과 같습니다.
앱은 ❶ 생성된 상태, ❷ 시작된 상태, ❸ 재개된 상태, ➍ 일시정지된 상태, ➎ 멈춰진 상태, ➏ 종료된 상태가 있습니다. 각 상태에 진입하려면 그에 맞는 콜백 함수가 호출되어야 합니다. 예를 들어 onCreate( ) 함수가 호출되어야 ‘액티비티가 생성된 상태’가 됩니다. 액티비티가 생성된 후 시작이 될 수 있습니다. 앱을 종료하려면 ‘멈춰진 상태’에서 onDestroy( ) 함수가 호출되어야 하는 거죠. 다른 상태와 달리 ‘종료된 상태’의 액티비티는 다시는 상태 변환을 할 수 없습니다.
다 외우지 않아도 됩니다. 액티비티는 생성부터 소멸까지 각각의 상태를 거치며 그때 수행할 수 있는 일이 있다는 정도만 기억합시다. 그래서 각 콜백 함수마다 할 수 있는 일이 따로 있습니다. 간단한 MainActivity.kt 코드를 살펴보면서 설명드리겠습니다.
❶ onCreate( ) 콜백 함수가 보입니다. 이 함수가 호출되면 어떤 상태가 되는지 생명 주기 그림에서 찾아보세요. 어디에 있는지 찾았나요? 네, 액티비티를 ‘생성된 상태’로 만들어줍니다. 따라서 액티비티에 필요한 초기 설정을 여기서 해주면 됩니다. 대표적인 초기화 설정으로 보여줄 레이아웃을 선택하는 걸 들 수 있습니다. ❷ setContentView( ) 함수로 사용자에게 보여줄 레이아웃을 지정합니다. 레이아웃을 정의한 파일(리소스)의 ID를 인수로 주면 되는 거죠.
정리하자면 ‘생성된 상태’가 되려면 화면이 있어야 하고, 화면이 있으려면 사용할 레이아웃이 뭔지 알아야 합니다. 그러므로 ‘생성된 상태’ 이전에는 꼭 레이아웃을 onCreate( ) 함수에서 지정해주어야 하는 겁니다. 콜백 함수마다 할 수 있는 일이 다르다는 말이 이제 이해가 가시나요? 그럼 각각의 콜백 함수에서 할 일을 간단히 알아보겠습니다.
다음은 액티비티가 시작될 때 실행되는 콜백 함수들입니다.
- onCreate( ) : 시스템이 액티비티를 처음 시작할 때 실행됩니다. 레이아웃 지정이나, 클래스 범위 변수를 초기화하는 등, 기본적인 앱 시작 로직을 여기서 구현해줍니다.
- onStart( ) : 액티비티가 시작된 상태에 들어가기 직전에 실행됩니다. 액티비티가 사용자에게 보이지만 사용자와의 상호작용은 아직 준비하는 단계입니다. UI 관련 로직을 초기화하는 코드를 작성하면 됩니다.
- onResume( ) : 액티비티가 재개된 상태로 들어가기 직전에 실행됩니다. 이제 드디어 액티비티와 사용자의 상호작용이 가능해집니다. 전화가 온다거나, 사용자가 다른 액티비티로 이동하는 등 포커스를 잃는 경우가 아닌 이상 액티비티는 재개된 상태로 존재합니다.
다음은 다른 액티비티가 호출될 때 실행되는 콜백 함수들입니다.
- onPause( ) : 사용자가 액티비티를 떠나는 경우 처음 실행되는 콜백 함수입니다. 더는 이 액티비티에 포커스가 없는 것이지요. 여기서 액티비티가 보이지 않을 때 더 이상 실행할 필요가 없는 부분들을 비활성화해주면 됩니다. 주의할 점은 onPause( )가 지속되는 시간이 굉장히 짧으므로 여기서 사용자의 정보를 데이터베이스에 저장하거나, 네트워크 호출을 하는 등 중요하거나 시간이 오래 걸리는 작업을 수행하면 안 됩니다. 이와 같은 부하가 큰 작업은 바로 다음 콜백인 onStop( )을 활용해주세요.
- onStop( ) : 액티비티가 사용자에게 더 이상 표시 안 되는 중단된 상태에 들어가기 직전에 실행되는 콜백입니다. 여기서는 데이터베이스에 정보를 저장하는 일처럼 부하가 큰 작업을 할 수 있습니다.
- onDestroy( ) : 액티비티가 완전히 소멸되기 직전에 호출되는 함수입니다.