코딩하는 개굴이

[안드로이드] Activity의 생명주기 본문

안드로이드

[안드로이드] Activity의 생명주기

개굴이모자 2022. 10. 27. 18:55
반응형

사용자가 앱을 사용하는 과정에서 앱을 나가거나 잠시 멈춰지거나 다시 시작하는 등의 상태가 변화하는 상황이 발생할 수 있다.

이러한 과정에 있어서 Activity 클래스는 각 상황의 상태 변화를 알 수 있도록 여러 콜백을 제공한다.

 

Activity의 상태 별 전환 과정의 클래스는 onCreate, onStart, onResume, onPause, onStop, onDestroy 로 총 6가지 콜백을 제공하며, 액티비티가 새로운 상태에 들어가게 되면 시스템은 각 콜백을 호출해준다.

 

아래 다이어그램은 이를 알기 쉽게 시각적으로 나타낸 것이다. 

 

 

각 콜백 메서드들에 대해 간략히 알아보자.

 

onCreate

액티비티가 생성될 때 호출되는 콜백으로, setContentView 가 여기서 수행된다. 이유는 해당 콜백은 생명주기에서 한번만 호출되기 때문에 초기화에 적합하기 때문이다.

 


onStart

화면에 Activity가 보여지기 시작할 때, (화면에 나타남) 불려지는 콜백으로 앱의 UI 를 관리하는 코드를 초기화하는 등 activity를 forground로 보내 사용자와 상호작용 할 수 있도록 준비하는 단계이다.

 


onResume

화면에 나타나있고 실행중인 상태에 해당한다. (화면에 나타나고 실행 중)

사용자가 Pause 된 후 다시 돌아올 경우 시스템은 onResume 메서드를 호출한다. 따라서, 활동이 재개됨에 따라 필요한 초기화 작업이 있을 경우 여기에서 수행되어야한다.

 


 

onPause

액티비티가 더이상 액티비티 스택의 탑에 있지 않을 때 호출된다.

액티비티 화면이 다른 액티비티에 가려진 상태로 화면이 없어지지는 않은 상태에 해당한다.

멀티 윈도우 모드를 사용 중인데 사용자가 상호작용하지 않고 있는 윈도우라면 여전히 표시는 되지만 pause 상태에 해당한다. 

GPS 나 근거리 통신 등 배터리 수명에 영향을 끼칠 수 있는 동작들을 멈춰야한다면 여기서 리소스를 해제하고 onResume 에서 다시 할당하는 것이 바람직하다.

 

Dialog 의 경우 activity 가 아니다. 따라서, 액티비티 위에 뜰 경우 Activity Stack 에 쌓이지 않으므로 pause 상태가 아님을 명심해야한다.
그러나, 간혹 다이얼로그 처럼 보이는데 액티비티인 경우가 존재한다.
예를들어 권한을 물어보는 창 등이 이에 해당하는데, 이는 투명한 배경의 액티비티로 차이가 있다.

https://programmar.tistory.com/46

 


onStop

다른 액티비티의 실행으로 완전히 가려진 상태이거나 (화면이 없어짐)  혹은 activity의 실행이 완료되어 종료하는 과정에서 호출될 수도 있다.

만일, 기기에서 메모리 부족으로 인해 onStop 에서 내려갔던 앱의 프로세스가 죽은 경우 onCreate를 통해 다시 돌아가게 된다.

 

(참고로, 위와 같은 경우에서 bundle을 통해 넘긴 값들에 영향이 크게 액티비티를 설계하여 메모리 부족으로 onCreate 에 다시 돌아간 경우 크래시가 발생한 이력이 있으므로, null 체크 등은 중요하다.)

 


onDestroy

액티비티가 종료되는 시점 즉 소멸되기 직전에 호출된다.

onStop 등에서 해제되지 않은 리소스들을 여기서 해제해야한다.

 

Configuration의 변경으로 인한 onDestroy 의 호출? 사용자의 의도적인 activity 종료 외에도 configuration의 변경으로 새로 activity 가 create 되어야하는 경우에도 일시적인 소멸을 위해 호출된다.

이전 상태의 정보를 유지하기 위해 onSavedInstanceState 를 사용하기도 한다. 그 외의 방법으로는 ViewModel 을 이용할 수도 있다.

만일 ViewModel 을 사용하면, ViewModel은 Activity와는 달리 소멸되지 않고 그대로 보존되며 acitivity가 create 되는 다음 인스턴스에 적용된다.

 

그 외의 상태 콜백

  • onSavedInstanceState
    • onPause 전에 호출되며 bundle을 이용해 강제 종료 후 재시작 시 onCreate 로 전달되어 활용할 수 있다.
      따라서, Configuration의 변경으로 인해 소멸될 경우 직전 상태의 정보를 저장하기 위해 주로 사용된다.
  • onRestoreInstanceState
    • 액티비티의 Destory 후 재생성 시 데이터를 회복한다.
      onStart와 onResume 사이에 호출되며 초기화 완료 후 복구되어야할 정보를 저장해 두어 강제 종료되더라도 그렇지 않은 것 처럼 복원할 수 있다. 그러나 사용자 액션으로 인해 그 이후 onResume 후의 상태는 해당 메서드로 복구할 수 없다.

 

참고 링크

반응형
Comments