액티비티 생명주기에 대해 들어보셨나요? 안드로이드 앱 프로그래밍을 한번이라도 접해보셨던 분이라면 액티비티 생명주기에 대해서 한번쯤 접해보셨을텐데요.
액티비티는 상태 정보를 가지고 있는데 이러한 액티비티의 상태 정보가 변화하는 것을 액티비티 생명주기
라고 합니다.
액티비티가 가질 수 있는 상태와 각 상태일 때의 의미는 다음과 같습니다.
상태 | 설명 |
---|---|
실행(Running) | 화면상에 액티비티가 보이면서 실행되어 있는 상태. 액티비티 스택의 최상에 있으며 포커스를 가지고 있음 |
일시 정지(Paused) | 사용자에게 보이지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. 대화상자가 위에 있어 일부가 가려진 경우에 해당함. |
중지(Stopped) | 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태. |
액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해서 실행과 중지, 그리고 메모리에서 해제될 때까지, 각 단계에서 자신이 현재 존재하는 단계에 관한 것을 상태정보로서 갖고 있습니다.
이런 상태 정보는 안드로이드 시스템에서 관리 하며, 액티비티의 상태가 바뀔 때마다 각 상태에 해당하는 메소드가 자동으로 호출됩니다.
예를 들어, 처음 Empty 액티비티를 생성하면 자동으로 만들어져 있는 onCreate() 메소드는 액티비티가 만들어질 때 시스템이 자동으로 호출하는 메소드입니다.
다음은 액티비티 생명주기를 표현한 다이어그램입니다.
위 다이어그램을 통해서 액티비티 상태가 바뀔 때마다 어떤 메소드가 호출되는지 손 쉽게 알 수 있습니다.
이 중에서 각각의 상태에 따른 주요 메소드만 살펴보자면 다음과 같습니다.
만약 새로운 액티비티가 생성된다면 onCraete(), onStart(), onResume() 이 차례대로 호출됩니다. 이 세 메소드가 호출된 후 최종적으로 액비티가 화면에 보이게 됩니다.
액티비티가 실행된 후, 새로운 액티비티가 그 위로 새로 실행된다면 onPause() 가 호출되면서 액티비티는 일시 정지나 중지 상태로 변하게 됩니다.
onStop() 은 액티비티가 중지 상태로 변화할 때 자동으로 호출되는 메소드입니다.
즉, 액티비티가 실행된 후에 다른 액티비티가 새롭게 실행되는 경우에는 onPause()[결과로 일시정지 상태가 됨] -> onStop()[결과로 중지 상태가 됨] 이 두 메소드가 차례때로 실행되어서 일시 정지 상태를 거쳐 중지 상태가 됩니다.
액티비티가 화면에서 사라져서 중지상태가 되었다가 화면에 나타나 다시 실행상태가 될 때는 onResume() 이 호출됩니다.
만약 액티비티가 메모리에서 사라지는 경우에는 onDestroy() 메소드가 호출됩니다.
상태변화에 따른 각각의 메소드에 대해서 더 상세히 살펴보겠습니다.
상태 메소드 | 설명 |
---|---|
onCreate() | 액티비티가 처음 만들어졌을 때 한번만 호출됩니다. 화면에 보이는 뷰들의 일반적인 상태를 설정합니다. 이전 상태가 저장되어 있는 경우에는 번들 객체를 참조하여 이전 상태를 복원할 수 있습니다. 이 메소드 다음에는 항상 onStrat() 메소드가 호출됩니다. |
onStart() | 액티비티가 화면에 보이기 직전에 호출됩니다. 액티비티가 화면 상에 보여지면 이 메소드 다음으로 onResume() 메소드가 호출됩니다. 액티비티가 화면에서 가려지면 이 메소드 다음으로 onStop() 메소드가 호출됩니다. |
onResume() | 액티비티가 사용자와 상호작용하기 바로 전에 호출됩니다. |
onRestart() | 액티비티가 중지된 이후에, 액티비티가 다시 시작되기 바로 전에 호출됩니다. 이 메소드 다음에는 항상 onStart() 메소드가 호출됩니다. |
onPause() | 또 다른 액티비티를 시작하려고 할 때 호출됩니다. 저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메소드입니다. 이 메소드가 리턴하기 저에는 다른 액티비티가 시작될 수 없으므로 onPause()에서의 작업은 매우 빨리 실행된 후 리턴되어야합니다. 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있습니다. (시스템이 다른 작업을 수행하기 위해 메모리가 필요할 경우, onPause() 메소드를 실행하여 일시정지 상태가 된 액티비티를 강제 종료시켜 메모리를 확보할 수 있다는 뜻) |
onStop() | 액티비티가 사용자에게 더 이상 보이지 않게 되었을 때 호출됩니다. 액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출됩니다. 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있습니다. |
onDestroy() | 액티비티가 소멸되어 메모리에서 없어지기 직전에 호출됩니다. 이 메소드는 액티비티가 받는 마지막 호출이 됩니다. 액티비티가 앱에 의해 종료되거나(finish()메소드가 호출되었을 때에 해당) 시스템이 강제로 종료시키는 경우에 호출될 수 있습니다. 위의 두 가지 경우를 구분할 때 isFinishing() 메소드를 이용합니다. 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있습니다. |
게임과 같은 실제 앱을 구성할 때는 중간에 전화가 오거나 갑지가 전화기가 종료된 이후 게임앱으로 다시 돌아 갔을 때, 게임 진행중이던 상태로 돌아갈 수 있어야 합니다.
예를 들어서 사용자가 게임의 2단계를 실행하고 있었다면 이 정보를 저장해 두었다가 앱이 다시 실행되었을 때 실행중이던 2단계 상태부터 다시 시작할 수 있도록 만들어야합니다.
이런 경우 사용되는 액티비티 수명주기 메소드는 onPause()와 onResume() 입니다.
이 두 가지 메소드는 앱이 멈추거나 없어질 때, 그리고 앱이 다시 보이거나 새로 실행될 때 호출되기 때문에 이 두 메소드에서 앱의 상태를 저장하거나 복원하는 작업을 구현해야 합니다.
( 이 방법 외에도 액티비티를 중지시키기 전에 호출되는 onSaveInstacneState() 메소드를 이용해 데이터를 임시 저장할 수 있습니다.
onSaveInstanceState() 메소드의 파라미터로 전달되는 번들 객체를 이용해 데이터를 저장하면 onCreate() 메소드나 onRestoreInstanceState() 메소드로 저장했던 데이터가 전달됩니다.
이 방식을 사용하면 앱이 강제 종료되거나 비정상 종료된 이후에 앱이 재실행되었을 때도 그 상태 그대로 보일 수 있도록 만들어줍니다. )
생성된 액티비티가 다른 액티비티에 의해서 가려지거나 종료될 때 수행되어야 하는 코드는 주로 onPause() 메소드에서 작성합니다.
기존에 실행중이더 액티비티가 다시 화면에 나타날 때 수행되어야 하는 코드는 주로 onResume() 메소드에서 작성합니다.
다음 포스팅은 Fragment 생명주기에 관련된 내용으로 찾아뵙겠습니다.