Activity 생명주기

두리두두·2024년 4월 21일

Android

목록 보기
9/25

액티비티 상태

활성

  • 액티비티 화면 출력, 사용자 사용 가능

일시정지

  • 액티비티 화면 출력되고 있으나, 사용자가 이벤트 발생시킬 수 없음
  • 액티비티 사용 중 다이얼로그 알림창이 뜨는 경우 등

비활성

  • 액티비티 화면이 출력되고 있지 않은 상태

생명주기

생명주기를 사용하는 이유

  • 사용자의 행동에 따른 앱 상태에 맞는 서비스를 제공하기 위해
  • 예를 들어 게임을 하다가 전화를 받고 돌아왔을 때 게임 상태를 유지

생명주기 콜백 메소드

  • 안드로이드 액티비티 생명주기를 도식화한 표

1) onCreate()

  • Activity가 생성되면 가장 먼저 호출됨
  • 화면 Layout 정의, View 생성, Databinding 등은 이곳에 구현함
  • 생명주기 통틀어서 단 한 번만 수행되는 메소드 (최초 실행되는 액티비티는 onCreate, onStart, noResume까지 실행됨)
  • 따라서 Activity 최초 실행에 해야하는 작업을 수행하기에 적합함

2) onStart()

  • Activity가 화면에 표시되기 직전에 호출됨
  • 화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현함

3) onResume()

  • Activity가 화면에 보여지는 직후에 호출됨
  • 현재 Activity가 사용자에게 포커스인 되어있는 상태
  • 액티비티 스택 가장 상단에 위치하며 사용자 상호작용

4) onPause()

  • Activity가 화면에 보여지지 않은 직후에 호출됨
  • 현재 Activity가 사용자에게 포커스아웃 되어있는 상태 (recent tray, 다이얼로그 등)
  • 액티비티가 포그라운드에 없을 동안 계속 실행되어서는 안 되지만 언젠가 다시 시작할 작업을 일시중지하는 작업을 수행한다.

    TIP
    onPause() 는 아주 잠깐 실행되기 때문에 무언갈 저장하는 작업을 실행하기엔 시간이 부족할 수 있다. 따라서 onPause() 내에서는 사용자 데이터 저장, 네트워크 호출, DB 트랜잭션 등을 실행해서는 안 된다. 이렇게 부하가 큰 작업들은 onStop() 에서 수행해야 한다.

  • 이후 호출되는 콜백은 멈출때 onStop이나 다시 하던거 할 때 onResume이다.

5) onStop()

  • Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
  • 홈 키를 누르는 경우, 다른 액티비티로의 이동이 있는 경우가 있음
  • 이후 호출되는 콜백은 액티비티가 다시 사용자와 상호작용을 위해 시작되면 onRestart()이며 액티비티가 완전히 종료되면 onDestroy()이다.

6) onDestroy()

  • Activity가 완전히 종료되었을 때 호출되는 메소드
  • 현재 액티비티를 제거하거나, 새로운 액티비티를 시작하거나, 기존 Stopped 액티비티가 Resume되어 재진입하게 되는 상황에서 중지 작업을 수행한다.
    (1) finish() 가 호출되거나 사용자가 앱을 종료하여 액티비티가 종료되는 경우
    (2) 화면 구성이 변경되어 (기기 회전 등) 일시적으로 액티비티를 소멸시키는 경우

    TIP
    액티비티가 종료되는 경우 onDestroy() 가 마지막 라이프사이클 콜백 메소드가 된다. 만약 위의 2번 사유로 인해 호출된거라면, 시스템이 즉시 새롭게 변경된 액티비티 인스턴스를 생성하여 onCreate() 를 호출한다.

7) onRestart()

  • onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
  • onRestart()가 호출된 이후 항상 이어서 onStart()가 호출됨

상태 저장

onSaveInstanceState

  • 액티비티를 명시적으로 종료하는 경우가 아니라 나중에 재생성될 경우를 대비해 onStop() 호출 후, 현재 UI 상태를 저장하기 위해 호출
  • 액티비티가 완전히 가려져 Stopped 상태가 되면 시스템이 액티비티를 제거할수도 있기 때문에 onSaveInstanceState()가 항상 호출되지만, 제거되지 않고 액티비티가 돌아오는 경우에는 onRestoreInstanceState()가 호출되진 않습니다.
  • onSaveInstanceState()에서는 데이터를 직렬화해 disk에 저장합니다.
  • 저장한 데이터는 onCreate()와 onRestoreInstanceState()에서 파라미터 Bundle 객체로 제공됩니다.
profile
야금야금 앱 개발자

0개의 댓글