[kotlin] 생명주기

Boknami·2023년 3월 26일
0

코틀린

목록 보기
1/19
post-thumbnail

따로 개념을 확실히 잡지 않고 무작정 UI와 이벤트 처리들을 다루다보니 이 흐름이 어떻게 되는 흐름인지도 모르고 뭐가 조금만 바뀌면 새로 적응하는데 있어 어려움을 겪었다.

그래서 일단 기초적인 생명주기를 먼저 알아보려한다.

참고한 사이트는 안드로이드 디벨로퍼즈의
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
해당 사이트이다.

생명주기의 단계

안드로이드 디벨로퍼즈에 올라와있는 그림이다.
생명 주기 단계를 전환하기 위해 총 6가지 콜백을 구성된 OnCreate(), onStart(),onResume, onPause(), onStop(), onDestroy()를 지원한다.


[1] OnCreate

  • 시스템이 액티비티를 생성할 때 실행되며 필수적으로 구현해야한다.
  • 전체 수명 주기 동안 한 번만 발생해야 하는 코드들을 넣어둔다. 예를 들어 데이터 바인딩이나 액티비티를 ViewModel과 연결하고, 일부 클래스 범위 변수를 인스턴스화할 수도 있다.
  • 액티비티의 이전 저장 상태가 포함된 Bundle 객체인 savedInstanceState 매개변수를 수신 받는다. 이전 저장 상태 포함이니 만약 처음 생성된 활동인 경우 Bundle 객체의 값은 null이다.
  • (정확히 이해 X) 액티비티의 생명 주기와 연결된 생명 주기를 인식하는 구성요소가 있다면 이 구성요소는 ON_CREATE 이벤트를 수신한다. 따라서 @OnLifecycleEvent라는 주석이 있는 메서드가 호출되고, 생명 주기 인식 구성요소는 생성됨 상태에 필요한 모든 설정 코드를 실행할 수 있게 된다.

[2] onStart()

  • 액티비티가 시작된 상태가 되면 시스템이 onStart를 호출한다.
  • onStart()가 호출되면 액티비티가 사용자에게 표시된다.
  • 앱은 액티비티를 포그라운드에 보내 상호작용할 수 있도록 준비한다. 예를 들어 UI를 관리하는 코드를 초기화한다.
  • 액티비티가 시작된 상태로 전환되면 이 액티비티의 생명주기와 연결된 모든 생명 주기 인식 구성요소는 ON_START 이벤트를 수신한다.
  • onStart()는 매우 빠르게 완료되고, 생성됨 상태와 마찬가지로 활동은 시작됨 상태에 머무르지 않는다.
  • onStart()콜백이 완료되면 액티비티는 재개됨 상태에 들어가고, 시스템이 onResume() 메서드를 호출한다

[3]onResume()

  • 활동이 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 onResume() 콜백을 호출
  • 이 상태에 들어갔을 때 앱이 사용자와 상호작용을 한다.
  • 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무른다. 예를 들어 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트 등이 있다.
  • 활동이 재개됨 상태로 전환되면 이 액티비티의 생명 주기와 연결된 모든 생명 주기 인식 구성요소는 ON_RESUME 이벤트를 수신한다.
  • 이 상태에서 생명 주기 구성요소가 포그라운드에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화할 수 있습니다(예: 카메라 미리보기 시작).
  • 방해되는 이벤트가 발생하면 활동은 일시중지됨 상태에 들어가고, 시스템이 onPause() 콜백을 호출합니다.
  • 활동이 일시중지됨 상태에서 재개됨 상태로 돌아오면 시스템이 onResume() 메서드를 다시 한번 호출합니다. 따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 합니다.

[4]onPause()

  • 시스템은 사용자가 현재 액티비티를 떠나는 것을 나타내는 첫 번째 신호로 onPause를 호출(하지만 해당 활동이 항상 소멸되는 것은 아님)

  • 액티비티가 포그라운드에 있지 않게 되었다는 것을 나타낸다.(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음).

-Activity가 일시중지됨 상태일 때 잠시 후 다시 시작할 작업을 일시중지하거나 조정합니다.

  • API 수준 24 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행된다. 그렇기에 언제든지 그중 하나의 앱만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지시킨다.

  • [onPause보다 onStop이 좋은 경우1]
    일시중지된 활동은 멀티 윈도우 모드에서 여전히 보일 수 있다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋다.

  • [onPause보다 onStop이 좋은 경우2]
    onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있다. 그러므로 onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안된다! 이러한 작업들은 메서드 실행이 끝나기 전에 완료되지 못할 수도 있기 떄문이다. 그 대신, 부하가 큰 종료 작업은 onStop() 상태일 때 실행해야 합니다.


[5]onStop()

  • 활동이 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 onStop() 콜백을 호출. 예를 들어 새로 시작된 액티비티가 화면 전체를 차지할 경우에 적용됩니다.

  • 시스템은 액티비티의 실행이 완료되어 종료될 시점에 onStop()을 호출할 수도 있다.

  • 활동이 중단됨 상태로 전환하면 이 액티비티의 생명 주기와 연결된 모든 생명 주기 인식 구성요소는 ON_STOP 이벤트를 수신한다. 여기에서 수명 주기 구성요소는 구성요소가 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다.

  • onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 한다. 예를 들어 앱은 애니메이션을 일시중지하거나, 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 전환할 수 있다. onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 활동을 보고 있더라도 UI 관련 작업이 계속 진행됩니다.


[6]onDestroy()

  • onDestroy()는 액티비티가 소멸되기 전에 호출한다. 아래 2가지 중 하나에 해당할 때 호출한다.
  1. 사용자가 활동을 완전히 닫는다 or 액티비티에서 finish()가 호출되어 활동이 종료되는 경우
  2. 기기 회전 또는 멀티 윈도우 모드로 인해 시스템이 일시적으로 활동을 소멸시키는 경우
  • 활동이 소멸됨 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_DESTROY 이벤트를 수신한다. 여기서 수명 주기 구성요소는 활동이 소멸되기 전에 필요한 것을 정리할 수 있다.

  • 액티비티가 종료되는 경우 onDestroy()는 활동이 수신하는 마지막 수명 주기 콜백이 된다. 기기 회전 또는 멀티 윈도우 모드로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출한다.

  • 이전의 콜백에서 아직 해제되지 않은 모든 리소스(예: onStop())를 해제해야 한다.

  • (이해 완벽 X) - 활동에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel 객체를 사용하여 활동의 관련 뷰 데이터를 포함해야 합니다. 활동이 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 활동 인스턴스에 전달되므로 추가 작업이 필요하지 않습니다. 활동이 다시 생성되지 않을 경우 ViewModel은 onCleared() 메서드를 호출하여 활동이 소멸되기 전에 모든 데이터를 정리해야 합니다.

0개의 댓글