minuco
article thumbnail
Published 2023. 3. 8. 00:48
Android Activity Life cycle Android/TIL

Android Developers :: Life cycle

생명주기에 대해 한번 정리하고자한다. (andeoid Developers 참고)

생명주기에 대한 이해

사용자가 앱을 사용하면서 나가고 다시 돌아오고 하면서 Activity 인스턴스는 Life cycle 안에 서로 다른 상태를 통해 전환이 된다. Activity class는 Life cycle 의 상태변화(시스템이 활동을 생성, 중단 또는 다시 시작하거나, 활동이 있는 프로세스를 종료하는 등)를 알아차릴 수 있는 콜백을 제공한다.

※ Activity 상속 구조 Object > android.content.Context > android.content.ContextWrapper > android.view.ContextThemeWrapper > android.app.Activity

사용자가 Activity를 벗어났다가 다시 앱을 실행 시켰을 때 Activity 가 작동하는 방식을 Life cycle 콜백 메서드에서 선언할 수 있다. 즉, 각 콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다. 필요에 따라 작업을 하고 적절하게 전환을 처리한다면 앱이 더욱 안정적으로 기능할 수 있다.

예를들어 Life cycle 콜백을 잘 구현하면 아래와 같은 문제점이 발생하지 않도록 예방하는데 도움이 될 수 있다.

  • 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료가 되는 문제
  • 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
  • 사용자가 앱을 나갔다가 나중에 들어왔을 때 사용자의 진행 상태가 저장되지 않는 문제
  • 화면이 가로방향과 세로방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장도지 않는 문제

Activity Life Cyele

Activity Life cycle 단계 간에 전환하기 위해 Activity class 는 6가지 콜백으로 구성된 핵심 집합의 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()를 제공한다. 활동이 새로운 상태에 들어가면 시스템은 각 콜백을 호출한다.

onCreate() : 이 콜백은 시스템에 먼저 활동을 생성할 때 실행되는 것으로, 필수적으로 구현해야 한다. 활동이 생선된되면 생성된 상태가 된다. (onCreate() 메서드는 Activity의 전체 life cycle 동안 한 번만 발생해야 하는 기본 애플리케이션 로직을 실행한다.

예를 들어 onCreate() 를 구현하면 데이터를 목록에 바인딩 하고, 활동을 ViewModel과 연결하고, 일부 class범위 변수를 인스턴스화할 수도 있다. 이 메서드는 savedInstanceState 매개변수를 수신하는데, 이는 Activity의 이전 저장 상태가 포함된 Bundle 객체이다. 이번에 처음 생성된 활동인 경우 Bundle 객체의 값은 null이다.Bundle설명 1

* Bundle 이란?

Bundle 은 여러가지의 타입의 값을 저장하는 Map 클래스이다. 예를들면 String 같은 Bundle 클래스에 Mapping(대응, 변환)하는 것이다.Bundle 설명 2

onCreate() 메서드에 관한 다음 예시는 사용자 인터페이스 선언(XML 레이아웃 파일에 정의됨), 멤버 변수 정의, 일부 UI 구성 등의 활동에 관한 기본 설정을 보여준다. 이 예시에서 XML 레이아웃 파일은 파일의 리소스 ID인 R.layout.main_activity를 setContentView()에 전달하여 지정한다.

XML 파일을 정의하고 setContentView()에 전달하는 대신, 활동 코드에 새로운 View 객체를 생성하고 새로운 View를 ViewGroup에 넣어서 뷰 계층 구조를 빌드할 수 있다. 그런 다음 루트 ViewGroup을 setContentView()에 전달하여 그 레이아웃을 사용한다.

Activity는 생성됨 상태에 머무르지 않는다. onCreate() 메서드가 실행을 완료하면 시작됨 상태가 되고, 시스템이 연달아 onStart()와 onResume() 메서드를 호출한다.

onStart() Activity가 시작됨 상태에 들어가면 시스템은 onStart() 콜백을 호출하는데 onStart()가 호출이되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드(포그라운드란?)에 보내 상호작용할 수 있도록 준비한다. 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화 한다.

onStart() 메서드는 매우 빠르게 완료되고, 생성됨 상태와 마찬가지로 Activity는 시작됨 상태에 머무르지 않는다. 이 콜백이 완료되면 Activity가 재개됨 상태에 들어가고, 시스템이 onResume() 메서드를 호출합니다.

onResume() Activity가 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 onResune() 콜백을 호출한다. 이 상태에 들어갔을 때 앱이 사용자와 상호작용한다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 상태에 머무른다. 예를들어 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트가 이에 해당된다.

onPause() Activity가 일시중지됨 상태에서 재개됨 상태로 돌아오면 시스템이 onResume() 메서드를 다시 한번 호출합니다. 따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, Activity가 재개됨 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 합니다.

시스템은 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출합니다(하지만 해당 활동이 항상 소멸되는 것은 아님). 활동이 포그라운드에 있지 않게 되었다는 것을 나타낸다(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음). onPause() 메서드를 사용하여 Activity가 일시중지됨 상태일 때 계속 실행(또는 적절히 계속 실행)되어서는 안 되지만 잠시 후 다시 시작할 작업을 일시중지하거나 조정한다.

활동이 이 상태에 들어가는 이유는 여러 가지가 있다.

  1. onResume() 섹션에서 설명하였듯이, 일부 이벤트가 앱 실행을 방해된다. 이것이 가장 일반적인 사례이다.
  2. Android 7.0(API 수준 24) 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행된다. 언제든지 그중 하나의 앱(창)만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지시킨다.
  3. 새로운 반투명 활동(예: 대화상자)이 열립니다. 활동이 여전히 부분적으로 보이지만 포커스 상태가 아닌 경우에는 일시중지됨 상태로 유지됩니다.

onStop() Activity가 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 onStop() 콜백을 호출한다. 이는 예를들어 새로 시작된 활동이 화면 전체를 차지할 경우에 적용된다. 시스템은 활동의 실행이 완료되어 종료될 시점에 onStop()을 호출할 수도 있다.

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

또한 onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 한다. 예를 들어 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장할 수 있다.

onDestroy() 는 Activity가 소멸되기 전에 호출된다. 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출

  1. (사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우
  2. 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우

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

Activity가 종료되는 경우 onDestroy()는 Activity가 수신하는 마지막 Life cycle 콜백이 된다. 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활Activity 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출합니다.

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

'Android > TIL' 카테고리의 다른 글

SharedPreferences  (0) 2023.03.08
profile

minuco

@minuco

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!