본문 바로가기

안드로이드

안드로이드 액티비티 (Activity) 생명주기 (LifeCycle)

  오늘은 안드로이드 생명주기 LifeCycle에 대해서 포스팅을 해보려고 한다. 어플리케이션은 하나만 실행되어 있는게 아니라 이전에 실행되어있는 액티비티도 있고 스택에 계속 쌓이게 때문에 각 액티비티마다 상태에 따른 생명 주기가 존재한다. 이러한 액티비티의 라이프 사이클 개념을 이해하기 전에 BackStack 이라는 개념을 이해해야 한다. 

 

 

1. BackStack 

 

 안드로이드 앱의 경우 단일 액티비티가 아닌 여러 액티비티를 이용하여 UI를 구성하게 되는데 이때 새로 열리는 액티비티와 기존에 열려있던 액티비티는 각각 백스택을 통해서 관리된다. 

 

스택에 PUSH 와 POP을 통해서 관리가 되며, 새로 액티비티가 생성되면 스택에 PUSH가 되면서 기존 액티비티는 아래로 감쳐지게 되지만 Back 버튼을 눌러 새로 생성된 액티비티를 종료시키면 기존에 스택에 PUSH된 액티비티가 POP 되면서 화면에 보여지게 되고 그 아래에 있던 액티비티가 푸시가 된다. 그림으로 설명하면 아래와 같다.

 

안드로이드 BackStack (출처: https://jungwoon.github.io/android/2019/07/15/Activity/ )

 

2. 액티비티의 라이프 사이클 (Activity LifeCycle)

 

 안드로이드에서 액티비티는 아래 그림과 같은 생명주기 (LifeCycle)를 가지고 있다. 안드로이드 액티비티는 사용자의 사용으로 어플리케이션의 UI가 계속해서 화면전환이 일어남에 따라 적절한 메소드가 호출되므로 이를 숙지해서 액티비티를 작성해야 한다. (Task 관리와 더불어 화면전환이 일어날때 리스너 해제나 상태 값 저장 등이 꼭 필요한 경우가 있다. 이럴 경우 각 생명주기에 맞춰 메소드 호출이 꼭 필요하다.) 

 

 아래의 그림처럼 액티비티의 생명주기는 onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory() 순으로 실행되며, 경우에 따라서 onRestart() 메소드가 호출되기도 한다. 각 주기마다 이벤트에 의해서 호출되는 함수들을 정리하면 아래와 같다.

 

Activity LifeCycle

 

  • onCreate(): 액티비티가 처음 실행 되는 상태에서 제일 먼저 호출되는메소드로 초기화 작업에 관한 코드를 작성하는 곳이다. 

 

  • onStart(): 액티비티가 사용자에게 보여지기 바로 직전에 호출된다. 회원가입을 예로들면 객체를 onCreate에 선언하고 onStart에서 선언된 리스너를 등록한 후 이미 로그인한 사용자인지 아닌지를 구분하여 다음 어떤 액티비티로 넘어가게 될지에 대한 기능에 사용한다.

 

  • onResume(): UI 로딩이 끝난후 사용자 Input이 시작되기 전에 호출된다. 이러한 함수들이 다 호출되고 나면 비로소 어플리케이션이 Activity Running 상태가 된다. (onCreate 와 onStart가 사용자와 상호작용 하기 전과 직전에 일어난다면 onResume는 직접적으로 사용자의 터치 이벤트나 Toast 등이 동작할 수 있을때 호출된다.)

 

  • onPause(): 사용자에게 보여지지 않을때 호출된다. onResume과 짝을 이루며, 사용자가 홈 버튼을 클릭해서 액티비티가 일시적으로 화면에서 보이지 않거나 다이얼로그와 같은 액티비티가 앞에 뜬 상태를 예로 들수 있으며, onPause 상황에서는 사용자 Interaction을 받지 못하는 상태이다. 이러한 상황에서 각종 view나 데이터들을 Application Context 혹은 Preference를 통해서 임시로 저장해서 onResume으로 액티비가 재개되면 해당 액티비티와 데이터를 다시 보여주게끔 해줘야 하는 코드를 작성한다. (카메라를 사용하거나 위치 정보 등을 사용할 경우 리스너나 자원 등을 해제할 때도 onPause에 작성해주면 된다.)

 

  • onStop(): 액티비티가 더이상 사용자에게 보여지지 않을때 호출된다. onStop일 경우 onRestart를 거쳐서 onStart 생명주기로 넘어가 어플리케이션을 다시 킬수도 있다. 결국 onStop은 아직 액티비티가 완전히 소멸된 상태는 아니다. (액티비티를 사용중에 홈 버튼을 눌렀을 경우 onPause와 onStop이 순서대로 호출될 것이다. 아직 어플리케이션이 완전히 종료되지 않은 상태이기 때문에 다시 어플리케이션을 실행시키면 onRestart와 onStart가 호출된다.)

 

  • onDestory(): 액티비티를 완전히 종료 즉 어플리케이션을 완전히 종료했을 경우 호출된다. 이 이후에 어플리케이션을 다시 실행시키면 onCreate부터 생명주기가 시작된다. 

 

 이번 포스팅에서는 간단하게 액티비티의 생명주기에 대해서 알아봤다. 액티비티 생명주기는 처음에는 간과하고 코딩하게 되지만, 코드가 점점 커지고 최적화를 하는 시점에서 정말 중요한거 같다.. 아마 다음 포스팅에서는 프래그먼트의 생명주기에 대해서 포스팅을 할 것 같다. 원래는 프래그먼트에 대해서 개념과 예제를 포스팅하려고 했는데 이왕 액티비티 포스팅한김에 프래그먼트 생명주기 포스팅 후에 안드로이드 프래그먼트를 다루는 예제를 포스팅 하도록 하겠다.

 

그렇다면!! 다음 시간에..