[Android] Lifecycle

이도연·2024년 1월 18일
0

android studio

목록 보기
20/28
post-thumbnail









lifeCycle 메서드

1. onCreate()

onCreate() 는 시스템이 앱을 생성할 때 호출.

모든 Activity 에서 구현해야 하는 기본 메서드이다. onCreate() 메서드에서 활도으이 일회성 초기화를 실행해야 한다. onCreate() 에서 Activity 의 UI 레이아웃을 지정하는 setContent() 를 호출한다.

  • onCreate() 메서드를 재정의할 때, super 클래스 구현을 호출하여 Activity 생성을 완료해야 하므로 Activity 내에서 super.onCreate() 를 즉시 호출해야 한다.

Logcat 에 메시지를 쓴다. 개발자가 로그에 명시적으로 젆송하는 메시지를 비롯하여, 앱에 관한 Android 의 메시지가 표시된다.


Activity 최상위에 상수 추가

private const val TAG = "MainActivity"

onCreate() 메서드에서 super.onCreate() 호출 바로 뒤에 Log 찍기

Log.d(TAG, "onCreate Called")

필요한 경우 Log 클래스 가져오기

import android.util.Log

Log message

MainActivity  com.example.dessertclicker D onCreate Called

2. onStart()

onStart() 는, 앱이 화면에 표시되도록 하지만, 사용자는 아직 앱과 상호작용 할 수 없다.
onCreate() 직후 호출. onStart() 가 실행되면 Activity 가 화면에 표시된다.
onCreate() 는 한번만 호출되지만, onStart() 는 수명 주기동안 여러번 호출할 수 있다.

Log message

MainActivity  com.example.dessertclicker D onCreate Called
MainActivity  com.example.dessertclicker D onStart Called
MainActivity  com.example.dessertclicker D onStart Called

3. onResume()

활동이 처음부터 시작되면 다음 세 가지 수명 주기 콜백이 순서대로 모두 호출된다.

onCreate(): 시스템이 앱을 생성할 때 호출(앱 열릴때)
onStart(): 앱이 화면에 표시되도록 하지만 사용자는 아직 앱과 상호작용할 수 없다.(Create 랑 같이 시작되는 메서드. 백그라운드 상태에서 다시 들어가도 실행된다.)
onResume(): 앱을 포그라운드로 가져오고 사용자는 이제 앱과 상호작용할 수 있다.
이름과 달리 onResume() 메서드는 다시 시작할 대상이 없어도 시작 시 호출

MainActivity  com.example.dessertclicker D onCreate Called
MainActivity  com.example.dessertclicker D onStart Called
MainActivity  com.example.dessertclicker D onResume Called

lifeCycle 사용 사례

1. Activity 열거나 닫기

onPause(), onStop() + finish()

활동이 처음 시작되면 onCreate(), onStart(), onResume() 콜백이 호출된다. 이후 기기에서 뒤로 버튼을 탭하면

MainActivity  com.example.dessertclicker D onPause Called
MainActivity  com.example.dessertclicker D onStop Called

Logcat 에서 onPause(), onStop() 이 순서대로 호출된다.
Activity(app) 이 화면에서 삭제되고 stack 의 뒤로 이동한다.

코드 내에서 Activity 의 finish() 메서드를 수동으로 호출하거나, 사용자가 앱을 강제 종료하면 Android OS 에서는 Activity 를 닫을 수 있다.
ex) 사용자는 최근 화면에서 앱을 닫거나 강제종료 가능, 앱이 장시간 화면에 표시되지 않으면 OS 에서 자체적으로 Activity 종료

이를 통해 Android 는 배터리 수명을 보존하고, 리소스를 회수하여 다른 앱에서 사용할 수 있도록 한다.


2. Activity <-> Activity

사용자가 Android 기기와 상호작용할 때는 앱 간 전환, 홈으로 돌아가기, 새 앱 시작, 다른 활동(전화 통화) 등으로 인한 중단을 처리한다. Activity 는 사용자가 Activity 에서 벗어날 때마다 완전히 닫히지 않는다.

사용자가 돌아오면 동일한 Activity 가 다시 시작되어 화면에 표시된다. lifecycle 에서 이 부분을 app's visible lifecycle(앱의 표시 수명)이라고 한다.

앱은 백그라운드에 있을 때, 시스템 리소스와 배터리 수명을 보존한다. Activity lifecycle 과 콜백을 사용하여 앱이 백그라운드로 이동하는 시점을 알 수 있다. 진행 중인 작업을 일시 중지(onPause, onStop) 할 수 있다.

onPause() 가 호출되면 앱에 더 이상 포커스가 없다. onStop() 이후에는 앱이 더 이상 화면에 표시되지 않는다. Activity 가 중지되었지만 Activity 객체는 여전히 백그라운드에 메모리에 있다. 사용자가 앱으로 돌아올 수 있으므로 Android 는 활동 리소스를 유지한다.

최근 화면을 사용하여 앱으로 돌아가면 Logcat 활동은 onRestart() 및 onStart() 로 다시 시작된 후 onResume() 으로 재개된다.

MainActivity  com.example.dessertclicker D onRestart Called
MainActivity  com.example.dessertclicker D onStart Called
MainActivity  com.example.dessertclicker D onResume Called

Activity 가 Foreground 로 돌아오면 onCreate() 메서드 대신 onRestart() 메서드가 호출된다.

-> onPause() 와 onStop() 은 앱이 백그라운드로 전환될 때 호출된다. onRestart(), onStart(), onResume() 이 호출된다. onStart() 와 onStop() 은 사용자가 Activity 에서 나가거나 Activity 로 이동할 때 여러 번 호출된다.


3. 부분적으로 Activity 숨기기

onStart() 가 호출되면 앱이 화면에 표시. onResume() 이 호출되면 앱은 사용자 포커스를 획득한다. (사용자가 앱과 상호작용)

이처럼, 완전히 화면에 표시되고 사용자 포커스를 보유하는 life cycle 을 foreground lifetime 이라고 한다.

앱이 백그라운드로 이동하면 onPause() 후 포커스가 상실되고 onStop() 후에는 앱이 표시되지 않는다.
포커스와 가시성의 차이는 중요하다. Activity 가 화면에 부분적으로 표시되지만 사용자 포커스는 없을 수 있다.

MainActivity  com.example.dessertclicker D onPause Called

Activity 가 계속 부분적으로 표시되기 때문에, onStop() 은 호출되지 않는다. 그러나 Activity 에 사용자 포커스가 없어 사용자가 상호작용할 수 없다. foreground 에 있는 '공유'활동에 사용자 포커스가 있다.

onPause() 만 사용한 중단은, Activity 로 돌아가거나 다른 Activity 또는 앱으로 이동하기 전에 잠시 지속된다. 일반적으로 UI 를 계속 업데이트하여, 나머지 앱이 멈춘 것처럼 보이지 않도록 하는 것이 좋다.

onPause() 에서 실행되는 모든 코드가 다른 항목이 표시되는 것을 차단하므로 onPause() 의 코드는 가볍게 유지한다. ex) 전화가 오면 onPause() 의 코드는 수신 전화 알림을 지연

공유 대화상자 외부를 클릭하여 앱으로 돌아가면 onResume() 이 호출된다. onResum() 과 onPause() 는 모두 포커스와 관련이 있다. onResume() 은 Activity 에 포커스가 있을 때 호출되고, onPause() 는 Activity 에 포커스가 없을 때 호출된다.


onStart() 가 호출되면 앱이 화면에 표시된다. onResume() 이 호출되면 앱은 사용자 포커스를 획득한다. 즉 사용자가 앱과 상호작용할 수 있다.

앱이 완전히 화면에 표시되고 사용자 포커스를 보유하는 수명 주기 부분을 포그라운드 전체 기간이라고 한다.
앱이 백그라운드로 이동하면 onPause() 후에 포커스 상실, onStop() 후에 더 이상 앱이 표시되지 않는다.

포커스와 가시성의 차이가 중요하다. 활동이 화면에 부분적으로 표시되지만 사용자 포커스는 없을 수 있다. 예를 들어 공유 버튼을 누르면 shareActivity 는 화면 아래쪽 절반에 표시되지만, Activity 는 위쪽 절반에 표시된다. Logcat 확인 시 onPause() 만 호출된다. Activity 가 부분적으로 표시되나, 사용자 포커스가 없어 사용자가 상호작용할 수 없다. 포그라운드에 있는 shareActivity 에 사용자 포커스가 있다.

이 차이가 중요한 이유는 onPause() 만 사용한 중단은 보통 Activity 로 돌아가거나 다른 Activity 또는 앱으로 이동하기 전에 잠시 지속된다. 일반적으로 UI 를 계속 업데이트하여 나머지 앱이 멈춘 것처럼 보이지 않도록 하는 것이 좋다.

onPause() 에서 실행되는 모든 코드가 다른 항목이 표시되는 것을 차단하므로 onPause() 의 코드를 가볍게 유지한다. 예를 들어 전화가 걸려오면 onPause() 의 코드는 수신 전화 알림을 지연시킬 수 있다.

다시 Activity 로 돌아가면 onResume() 이 호출된다.

-> onResume()과 onPause()는 모두 포커스와 관련이 있다. onResume() 메서드는 활동에 포커스가 있을 때 호출되고 onPause()는 활동에 포커스가 없을 때 호출된다.


구성 변경사항

구성 변경이 Activity life cycle 에 영향을 미치기도 한다.

구성 변경은, 기기 상태가 급격하게 변경되어 시스템이 변경 사항을 확인하는 가장 쉬운 방법이 활동을 완전히 종료하고 다시 빌드하는 것일 때 발생한다.
ex) 언어 변경 시 텍스트 방향과 문자열 길이 변화로 인해 전체 레이아웃 변경, 가로세로 화면모드 변경

onDestroy() 는 onStop() 후 호출되며, Activity 소멸 직전 호출된다.

MainActivity  com.example.dessertclicker D onPause Called
MainActivity  com.example.dessertclicker D onStop Called
MainActivity  com.example.dessertclicker D onDestroy Called

구성 변경으로 인한(여기서는 화면 회전) onDestroy() 호출 후 Logcat 을 검토하면 onPause(), onStop(), onDestroy() 가 순서대로 호출된다.

구성 변경 시 데이터 손실

MainActivity  com.example.dessertclicker D onCreate Called
MainActivity  com.example.dessertclicker D onStart Called
MainActivity  com.example.dessertclicker D onResume Called
MainActivity  com.example.dessertclicker D onPause Called
MainActivity  com.example.dessertclicker D onStop Called
MainActivity  com.example.dessertclicker D onDestroy Called
MainActivity  com.example.dessertclicker D onCreate Called
MainActivity  com.example.dessertclicker D onStart Called
MainActivity  com.example.dessertclicker D onResume Called

onDestroy() 가 호출되면, 모든 life cycle 콜백을 호출하여 Activity 를 종료한다. 그 다음 Activity 가 다시 만들어질 때, 시스템은 모든 life cycle 콜백을 호출하여 Activity 를 시작한다.
Activity 는 기본값으로 다시 시작된다. (디저트 이미지, 판매량, 총 수익이 0으로 재설정)


요약

활동 수명 주기

  • 활동 수명 주기는 활동이 전환되는 일련의 상태입니다. 활동 수명 주기는 Android OS에서 처음 활동을 만들 때 시작되고 OS에서 활동을 소멸할 때 끝납니다.
  • 사용자가 활동 간에 그리고 앱 안팎으로 이동할 때 각 활동은 활동 수명 주기의 상태 간에 이동합니다.
  • 활동 수명 주기의 각 상태에는 Activity 클래스에서 재정의할 수 있는 상응하는 콜백 메서드가 있습니다. 수명 주기 메서드의 핵심 집합은 다음과 같습니다. onCreate(), onRestart(), onStart(), onResume(), onPause(), onStop(), onDestroy()
  • 활동이 수명 주기 상태로 전환될 때 발생하는 동작을 추가하려면 상태의 콜백 메서드를 재정의합니다.
  • Android 스튜디오에서 스켈레톤 재정의 메서드를 클래스에 추가하려면 Code > Override Methods...를 선택하거나 Control+O를 누릅니다.

로그로 로깅

  • Android Logging API와 특히 Log 클래스를 사용하여 Android 스튜디오 내 Logcat에 표시되는 짧은 메시지를 작성할 수 있습니다.
  • Log.d()를 사용하여 디버그 메시지를 작성합니다. 이 메서드는 두 가지 인수를 사용합니다. 로그 태그(일반적으로 클래스 이름)와 로그 메시지(짧은 문자열)입니다.
  • Android 스튜디오에서 Logcat 창을 사용하여 작성한 메시지를 비롯한 시스템 로그를 확인합니다.

구성 변경

  • 구성 변경은 기기 상태가 매우 급격하게 변경되어 시스템이 변경사항을 확인하는 가장 쉬운 방법이 활동을 소멸시키고 다시 빌드하는 것일 때 발생합니다.
  • 구성 변경은 사용자가 기기를 세로 모드에서 가로 모드로 또는 가로 모드에서 세로 모드로 회전할 때 가장 흔하게 발생합니다. 기기 언어가 변경되거나 사용자가 하드웨어 키보드를 연결할 때도 구성이 변경될 수 있습니다.
  • 구성 변경이 발생하면 Android는 모든 활동 수명 주기의 종료 콜백을 호출합니다. 그러면 Android는 활동을 처음부터 다시 시작하여 모든 수명 주기 시작 콜백을 실행합니다.
  • Android는 구성 변경으로 인해 앱을 종료할 때 onCreate()를 사용하여 활동을 다시 시작합니다.
  • 구성 변경 이후에도 효력을 유지해야 하는 값을 저장하려면 rememberSaveable을 사용해 변수를 선언합니다.





출처

0개의 댓글