Android - 액티비티 생명주기

Posted by RoadtoS7 on January 12, 2020 · 6 mins read

액티비티 생명주기

액티비티 생명주기에 대해 들어보셨나요? 안드로이드 앱 프로그래밍을 한번이라도 접해보셨던 분이라면 액티비티 생명주기에 대해서 한번쯤 접해보셨을텐데요.



액티비티는 상태 정보를 가지고 있는데 이러한 액티비티의 상태 정보가 변화하는 것액티비티 생명주기 라고 합니다.



액티비티가 가질 수 있는 상태와 각 상태일 때의 의미는 다음과 같습니다.

상태 설명
실행(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 생명주기에 관련된 내용으로 찾아뵙겠습니다.