Android

[안드로이드] Activity LifeCycle

베르_최성훈 2023. 5. 1. 17:02

Activity 란?

안드로이드 4대 컴포넌트 중 하나이자 사용자들과 상호작용하기 위한 진입점.

 

Activity LifeCycle 란?

사용자가 앱을 켜고 끄고 다른 앱을 켜는 등의 활동을 할때

액티비티 인스턴스는 수명 주기 안에서 서로 다른 상태를 통해 전환된다. 

이때 Acticity 클래스는 활동이 상태 변화를 알아차릴 수 있는 여러 콜백을 제공한다.

 

이 생명 주기 콜백을 잘 구현하면 앱에서 문제가 발생하지 않게 예방할 수 있다!

 

기본 Activity  LifeCycle  종류

* 기본 6개만 명시되어 있으며 onSaveInstanceState(), onRestoreInstanceState() 도 존재한다. 

 

1. onCreate()

2. onStart()

3. onResume()

4. onPause()

5. onStop()

6. onDestroy()

 

 

1. onCreate()

시스템이 활동을 생성할 떄 실행되며 필수적으로 구현 !

전체 생명 주기 동안 한 번만 발생해야하는 기본 로직을 실행한다. 

 

할 일

  • 데이터를 List에 바인딩
  • AcitivtyviewModel 에 연결
  • 일부 클래스 범위 변수를 인스턴스화
  • 화면에 보이는 일반적인 상태를 설정

 

savedInstanceState 를 매개 변수로 받는데 활동 이전 저장 상태가 포함된 Bundle? 객체이다.

 

lateinit var textView: TextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // savedInstanceState 에 저장된 것을 key 로 가져온다.
    gameState = savedInstanceState?.getString(GAME_STATE_KEY)

    // UI layout 을 set
    // setContentView 에 xml 파일 리소스 ID 를 전달한다
    setContentView(R.layout.main_activity)

    // View 멤버를 찾을 수 있고 바인딩 할 수 있다.
    textView = findViewById(R.id.text_view)
}

// saved instance 가 onSaveInstanceState() 에서 저장되었을 경우 콜백된다
// 몇몇 state 는 onCreate 에서 reStore 하고
// onStart 가 끝난 뒤에 restore 가 필요한 것은 여기서 한다
// 번들은 onCreate() 의 savedInstanceState 와 같은 번들을 사용한다.

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    textView.text = savedInstanceState?.getString(TEXT_VIEW_KEY)
}


// onSaveInstanceState onDestroy 전에 호출
// 즉, 액티비티가 일시적으로 파괴될 때 호출된다. 인스턴스의 상태를 저장한다.
override fun onSaveInstanceState(outState: Bundle?) {

    //값 저장
    outState?.run {
        putString(GAME_STATE_KEY, gameState)
        putString(TEXT_VIEW_KEY, textView.text.toString())
    }

    super.onSaveInstanceState(outState)
}

 

onCreate() 메서드가 실행이 완료되면 created 상태로 유지되지 않는다. started 상태가 되고 연달아 onStart()onResume() 메서드를 호출한다.

 

2. onStart()

Activity 가 사용자에게 보이기 시작한다. 앱은 상호작용할 수 있도록 준비한다.

앱이 UI 를 관리하는 코드를 초기화한다.

액티비티의 생명주기와 연결된 모든 생명 주기 인식 컴포넌트는 ON_START 이벤트를 수신한다.

 

매우 빠르게 완료되고, started 상태로 유지되지 않는다. 곧바로 onResume() 을 호출한다.

 

할 일 

  • 데이터 갱신
  • 애니메이션 시작 

UI 초기화에 적합하나 작업이 빠르게 완료되기에 화면이 부자연스럽게 보일 수 있으므로 UI 수정은 조심해야 한다.

 

 

3. onResume()

resumed 되면 시스템에서 콜백을 호출한다. 앱이 사용자와 상호작용하는 상태.

앱은 포커스를 빼앗는 일이 발생할 때까지 이 상태를 유지한다.

 

액티비티의 생명주기와 연결된 모든 생명 주기 인식 컴포넌트는 ON_RESUME 이벤트를 수신한다.

여기에서 포커스가 필요한 카메라 미리 보기 시작과 같은 기능을 활성화 할 수 있다.

 

중단 이벤트가 발생하면 활동이 Paused 상태로 전환되고 onPause() 를 호출한다.

 

when: Paused -> Resumed 

then : onResume() 을 실행

 

4. onPause()

사용자가 Activity 를 떠나는 첫 번째 표시이다.

그러나 액티비티가 소멸하고 있음을 의미하는 것은 아니다.

 

호출되는 경우 

앱 실행을 중단하는 이벤트가 일어나면 Paused

멀티 윈도우에서 한 번에 하나의 앱에만 포커스가 있고 시스템은 다른 모든 앱을 Paused

대화 상자와 같은 새로운 반투명 액티비티를 열면 Paused

 

액티비티의 생명주기와 연결된 모든 생명 주기 인식 컴포넌트는 ON_PAUSE 이벤트를 수신한다.

 

할 일

  • 카메라 미리 보기 중지와 같은 포커스가 없을 때 필요가 없는 기능을 중지할 수 있다. 
  • Paused 상태에서 계속할 수 없거나 적당히 계속할 수 있는 작업을 일시 중지하거나 조정.
  • 시스템 리소스, 센서에 핸들, 배터리가 닳는 리소스 등을 해제할 수 있다. 

 

멀티 윈도우 모드에 있는 경우 액티비티가 완전히 보일 수 있기 때문에 이때 UI 리소스 및 작업은

onPause() 대신 onStop()를 사용하는 것이 좋다.

 

아주 잠깐 실행되므로 다음은 금지한다. (실행이 끝나기 전에 완료하지 못할 수 있다)

  • 애플리케이션 또는 사용자 데이터를 저장
  • 네트워크 호출
  • 데이터베이스 트랜잭션을 실행

부하가 큰 종료 작업은 onStop() 에서 실행하자!

 

 

5. onStop()

액티비티가 사용자에게 더 이상 표시되지 않으면 Stoped 상태가 된다.

예를 들어 새로 시작된 액티비티가 화면 전체를 차지하면 적용된다. onStop()

 

액티비티의 생명주기와 연결된 모든 생명 주기 인식 컴포넌트는 ON_STOP 이벤트를 수신한다.

 

생명 주기 인식 컴포넌트는 화면에 보이지 않을 때 실행할 필요없는 기능을 모두 정지할 수 있다.

 

할 일

  • 앱이 사용자에게 보이지 않는 동안 앱이 필요하지 않은 리소스를 해제하거나 조정
  • 애니메이션을 일시중지
  • 세밀한 위치 업데이트 -> 대략적인 위치 업데이트
  • 멀티윈도우에서 onPause() 대신 onStop() 을 사용해 UI 관련 작업을 저장
  • CPU 를 많이 소모하는 종료 작업 (DB 저장 등)

액티비티가 Stoped 상태가 되면 Activity 는 메모리 안에 머무르게 된다.

이 객체가 모든 상태, 멤버 정보를 관리하지만 Window 관리자와 연결되어 있지는 않다.

활동이 다시 시작되면 이 정보를 다시 호출한다.

 

view 의 현재 상태를 기록하기 때문에 Restarted 될 때 다시 초기화 할 필요없다.

 

ActivityStoped 에서 재시작되면 onRestart() 로 종료되면 onDestory() 로 간다.

 

6. onDestroy()

Activity 가 소멸되기 전에 호출된다.

 

onDestroy() 는 호출되지 않을 수 있으니 주의할 것!

 

다음 중 하나에 해당될 때 이 콜백을 호출

  • 사용자가 액티비티를 완전히 닫거나 finish() 가 호출되어 종료
  • 시스템이 일시적으로 Activity 를 소멸시키는 경우 (화면 회전, 멀티 윈도우 모드 등)

 

액티비티의 생명주기와 연결된 모든 생명 주기 인식 컴포넌트는 ON_DESTORY 이벤트를 수신한다.

 

소멸되기 전에 필요한 것을 정리해야 한다!

 

할 일

  • - ViewModel 객체를 사용하여 액티비티와 Activity 관련 View 데이터를 포함해야 함
    (ViewModel 은 그대로 보전되어 인스턴스에 전달되므로 추가적인 작업이 필요하지 않다)
  • - 액티비티가 다시 생성되지 않는 경우에 onCleared() 를 호출하여 모든 데이터를 정리
  • onStop() 에서 해제되지 않은 모든 리소스를 해제해야 한다.

마지막 생명 주기가 콜백되면 구성 변경으로 새로운 액티비티 인스턴스를 생성한 다음 onCreate() 를 호출하게 된다.

 

자세한 내용은 안드로이드 Docs 를 참고하세요!

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko#alc

 

활동 수명 주기에 관한 이해  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

액티비티 생명주기 관련 문제 풀어보기!

A 액티비티에서 다른 B 액티비티를 호출했을 때

  1. onPause() --- A
  2. onCreate() --- B
  3. onStart() --- B
  4. onResume() --- B
  5. onStop() --- A

 

B 액티비티 종료 후 다시 A 액티비티가 보여질 때

  1. onPause() --- B
  2. onRestart() --- A
  3. onStart() --- A
  4. onResume() --- A
  5. onStop() --- B
  6. onDestroy() --- B

home 버튼 눌렀을 때

  1. onPause() 
  2. onStop() 

home 버튼 눌렀던 앱을 다시 누를 경우

  1. onRestart() 
  2. onStart() 
  3. onResume() 

기기 회전 시 

  1. onPause()
  2. onStop()
  3. onSaveInstanceState()
  4. onDestroy()
  5. onCreate()
  6. onStart()
  7. onRestoreInstanceState()
  8. onResume()

투명한 다른 액티비티를 호출할 때

  1. onPause() --- A
  2. onCreate() --- B
  3. onStart() --- B
  4. onResume() --- B