본문 바로가기

모바일프로그래밍/Android

Activity의 생명 주기


Activity의 생명 주기  

Activity의 상태는 크게 활성(Activity), 일시정지(Pause), 정지(Stopped) 로 나눌 수 있습니다.

활성(Activity)
현재 화면에 Activity가 표시되는 상태이며, 사용자와 상호작용 할 수 있는 상태를 말합니다. 일반적으로 Activity가 화면에 표시되고 있을때를 의미합니다.

일시정지(Pause)
화면에는 Activity가 보이지만, 사용자와 상호작용 할 수 없는 상태입니다. 즉, 배경이 투명한 Activity나 화면 전체를 가리지 않는 Activity에 의해 본 Activity의 일부가 가려진 경우를 말합니다. Dialog의 경우는 Activity의 일부를 가리긴 하지만 Dialog도 Activity의 일부이기 때문에 Dialog가 띄워진 경우는 일시정지 상태가 아닙니다.

정지(Stopped)다른 Activity에 의해 완전히 가려진 상태입니다.


Activity는 위와 같이 크게 3가지 상태로 나뉘지만 정확히는 아래와 같은 7개의 상태로 나눠지게 됩니다. 
  • onCreate()

  • onStart()

  • onResume()

  • onPause()

  • onStop()

  • onDestroy()
  

Activity의 생명 주기

Activity는 생명 주기에 따라 상태가 변화하는데 이를 위해 각 상태에 해당하는 메소드가 호출됩니다. 따라서, 각 상태에 해당하는 메소드를 오버라이드 하면 특정 상태에서 원하는 작업을 실행시킬 수 있습니다.




Activity의 시작  

Activity의 생명 주기
           
Activity의 생성은 onCreate 메소드를 통해 이루어집니다. 따라서 onCreate 메소드에서는 Activity 초기화를 담당하는 코드들을 처리해주어야 합니다.

onCreate 메소드를 통해 Activity를 띄우기 위한 모든 준비가 완료되었다면, onStart 메소드를 호출해 Activity를 시작합니다. 하지만, 이 상태는 Activity가 완전히 화면에 표시된 상태가 아니라 Activity가 화면에 표시되기 직전의 상태입니다.

Activity의 화면 표시는 그 다음에 실행되는 onResume 메소드에 의해 이루어집니다. onResume 메소드는 Activity가 화면에 표시되고, 사용자와 상호작용하기 직전의 상태입니다.
 



Activity의 정지/일시정지  

Activity의 생명 주기

Activity가 화면에 표시되고, 사용자와 상호 작용할 수 있는 활성상태(Active)에서 다른 Activity에 의해 가려지거나 화면에서 사라지게 되면 그 Activity는 정지상태(Stopped)가 됩니다. 이때 실행되는 메소드가 onStop 입니다. 

일반적으로 정지상태에서는 사용자가 Activity를 다시 사용할 것을 대비하여 메모리에서 바로 사라지지 않고 올라가 있다가 사용자가 다시 Activity를 호출할 경우 Activity를 재생성 할 필요없이 화면에만 띄우면 되므로 onRestart - onStart - onResume 과정을 거쳐 다시 활성상태가 됩니다. 

만일, 정지상태에서 메모리 부족으로 메모리 확보가 필요한 상황이 되면 Activity는 강제 종료되어 메모리 상에서 사라지고 사용자가 Activity를 다시 호출할 경우 onCreate - onStart- onResume 과정을 거쳐 Activity가 재실행됩니다.


일시정지상태(Paused)는 Activity가 화면에 표시되고 있지만 사용자와 상호작용을 하지 않고 있는 상태이고 이때 실행되는 메소드는 onPause 입니다.

일시정지 상태에서는 일반적으로 사용자가 어떤 작업(예를 들어 어떤 문자열의 입력 등)을 진행중일 가능성이 높습니다. 그런데 이때 메모리가 부족하여 Activity가 종료된다면 사용자가 입력했던 테이터들이 손실됩니다.
따라서 이를 대비해 사용자의 입력 값등을 미리 저장해놓아야 하는데 이때 onSaveInstanceState 메소드를 이용합니다. onSaveInstanceState 메소드는 Activity의 종료전 상태를 Bundle 객체로 저장해 놓았다가 나중에 해당 Activity를 다시 실행할 때 onCreate 메소드나 onRestoreInstanceState 메소드에 Bundle 객체로 전달해 줍니다. 

onSaveInstanceState 메소드는 Activity가 강제 종료 되었을때만 호출되고, onRestoreInstanceState 메소드는 강제 종료된 Activity를 재실행 할때에만 호출되므로, 만일 Activity가 시작하거나 종료될 때 해주어야 할 작업이 있다면 이 두 메소드를 오버라이드 하는 대신 onCreate, onStop 또는 onDestroy 메소드를 오버라이드한 후 그 안에 코드를 구현해야 안정적으로 해당 작업을 처리할 수 있습니다. (참고로 만일 onSaveInstanceState 메소드가 실행된다면 onPause 혹은 onStop 메소드 이후에 호출되고, onRestoreInstanceState 메소드가 실행된다면 onCreate 메소드 다음에 호출됩니다.)