개발/Rising Camp Android 4th

[2주차] 안드로이드 생명주기

Eun 2022. 2. 14. 01:25

액티비티는 안드로이드 4대 컴포넌트 중에 하나이다. 4대 컴포넌트 중에서도 가장 중요하다. 

 

생명주기

생명주기는 액티비티가 생성, 정지 재생, 종료 등 일어나는 상태 변화와 그에 따른 콜백 메소드를 총칭한다.

액티비티는 활동이 상태변화를 알아차릴 수 있는 여러 콜백을 제공한다.

예를 들어서

카카오톡을 실행시켰다가 유튜브를 실행시켰을 경우, 

유튜브를 실행시켰다가 카카오톡을 실행시키면 처음부터 보이는 것이 아닌 진행상태를 다시 보여주는 경우,

화면이 가로 방향과 세로 방향으로 회전할 경우,

앱을 실행하다가 전화왔을 경우 등등..

이러한 상태변화를 알려주는 여러 메소드들이 있다. 해당 메소드는 아래에서 설명한다.

 

생명주기가 필요한 이유?

액티비티가 변화할 때 발생하는 문제들을 사전에 방지할 수 있다.

1. 앱 전환 시 비정상 종료되는 문제

2. 앱을 사용하지 않을 때 시스템 리소스가 낭비되는 문제

3. 앱을 나갔다 들어올 때 사용자의 상태가 저장되지 않는 문제

4. 화면을 가로-세로 회전할 때 비정상 종료되거나 사용자 상태가 저장되지 않는 문제

 

위와 같은 문제들을 예방하기위해 필요한 것이 생명주기이다.

 

생명주기 메소드

액티비티 클래스는 6가지 콜백으로 구성 되어있는데,

onCreate(), onstart(), onResume(), onPause(), onStop(), onDestory()를 제공한다. 

 

최초로 앱을 실행하면 onCreate()가 호출되고 onStart()가 호출되는데 이 시점부터 사용자가 액티비티는 볼 수 있다.

그리고 실제 사용자와 상호작용이 가능한 포그라운드에 위치하면 onResume()이 호출된다. 이 상태를 액티비티가 실행 중인 것으로 본다.

 

반대로 액티비티가 실행 중인 상태에서 사용자와 상호작용이 불가능한 상태, 즉 포커스를 잃은 상태가 되면 onPause()가 호출된다.  onStop()은 액티비티가 더 이상 보이지 않을 때 호출된다. 그리고 액티비티가 종료되거나 앱 프로세스 자체가 종료되면 onDestroy()가 호출된다. 

 

위의 로직을 그림으로 나타내면 다음과 같다.

https://brunch.co.kr/@mystoryg/80

onCreate()

  • 시스템이 먼저 액티비티를 생성할 때 실행되는 것
  • 전체 생명 주기 동안 한번만 발생해야 하는 기본 어플리케이션 시작 로직
  • 데이터를 목록에 바인딩하는 단계
  • 시작된 상태에 필요한 모든 설정 코드를 실행
  • 액티비티는 시작된 상태에 머무르지 않기 때문에 연달아 onStart(), onResume() 메소드를 호출

onStart()

  • onCreate()상태 다음으로 호출되는 메소드
  • 액티비티가 사용자에게 보여지는 단계
  • 이 단계에서 앱이 U를 관리하는 코드를 초기화한다.
  • 이 단계에 머무리지 않고 시스템은 onResume()을 호출함

onResume()

  • onStart()를 거치면 액티비티가 화면에 표시되고 onResume()을 호출함
  • 앱이 사용자와 상호작용하는 단계
  • 앱이 포커스를 떠날때까지 이 상태에 머문다. (전화가 오거나, 다른 액티비티로 이동, 화면이 꺼지는 등

onPause()

  • 액티비티가 일시중지되는 상태일 때 onPause() 메소드를 호출함
  • 액티비티가 여전히 부분적으로 보이지만 포커스 상태가 아닌 경우 (ex.대화상자)
  • 일시중지 상태에서 다시 액티비티를 실행하면 onResume()을 호출함
  • 액티비티가 다시 실행되면 액티비티 인스턴스를 메모리에 남겨두고 시스템이 onResume()을 호출할 때 인스턴스를 다시 호출한다. (따라서 이어서 실행을 계속할 수 있음)

onStop()

  • 액티비티가 사용자에게 더이상 표시되지 않으면 onStop() 메소드 호출
  • 새로 시작된 활동이 화면 전체를 차지할 경우에 적용
  • 화면에 구성요소가 더이상 보이지 않을 때 실행할 필요가 없는 기능은 모두 정지할 때 이 메소드 안에 정의
  • 액티비티가 중단되면 액티비티 객체는 메모리 안에 저장된다. 그리고 활동이 다시 시작되면 onRestart()->onStart()를 호출하고 저장된 객체를 다시 호출한다. 저장된 객체는 레이아웃의 각 View의 상태도 기록하기 때문에 다른 액티비티를 실행하고 돌아와도 상태가 저장되어 있다.

onDestory()

  • 액티비티가 소멸되기 전에 호출한다.
  • 사용자가 활동을 완전히 종료했을 경우 or 기기 회전으로 시스템이 일시적으로 액티비티를 소멸시키는 경우
  • 활동이 소멸되기 전에 필요한 사항을 이 메소드에 정의
  • 기기회전으로 일시적으로 액티비티를 소멸했을 때 다시 생성해야한다. 그때 ViewModel 객체를 사용해서 저장하고 다음 활동 인스턴스에 전달된다. 

 

액티비티 메모리 관리

시스템은 RAM에 여유 공간이 필요할 때 프로세스를 종료한다. 따라서 프로세스의 상태에 따라서 종료할 가능성이 달라진다. 프로세스 상태는 활동 상태의 따라 달라진다. 

 

아래 그림을 통해서 어떤 상태일 때 프로세스가 종료될 확률이 높은지 보여주고 있다.

https://developer.android.com

 

액티비티 생명주기 전환

하나의 액티비티(MainActivity)에서 다른 액티비티(SecondActivity)를 실행하면 두 개 액티비티 모두 생명주기가 전환된다.

SecondActivity가 생성되는 동안 MainActivity는 작동을 중단하고 일시중지 or 정지 상태로 들어간다. SecondActivity 시작 과정이 Activity 중단 과정과 겹쳐 일어난다. 

 

작업 순서는 다음과 같다.

 

MainActivity에서 SecondActivity를 호출했을 때 순서

1. MainActivity의 onPause() 메소드가 실행이 된다.

2. SecondActivity의 onCreate(), onStart(), onResume() 메소드가 순차적으로 실행된다. (사용자 포커스는 SecondActivity에 있다.)

3. MainActivity가 더 이상 화면에 표시되지 않는 경우 onStop() 메소드가 실행된다. 

[MainActivity]onPause()
[SecondActivity]onCreate()
[SecondActivity]onStart()
[SecondActivity]onResume()
[MainActivity]onStop()

MainActivity의 onStop()이 SecondActivity의 라이프사이클이 끝나야 호출되는 것이 중요하다. 

 

SecondActivity에서 MainActivity로 돌아갈 때 순서

 

1. SecondActivity에서 onPause() 메소드가 실행된다.

2. MainActivity에서 onRestart(), onStart(), onResume() 메소드가 순차적으로 실행된다. (사용자 포커스는 MainActivity에 있다)

3. SecondActivity가 더 이상 화면에 표시되지 않는 경우 onStop() 메소드가 실행된다.

4. SecondActivity를 종료하는 메소드인 onDestroy() 를 호출하여 종료한다.  

 

여기서도 마찬가지로 SecondActivity를 종료시키고 MainActivity를 호출하는 것이 아닌,

SecondActivity를 멈추고 MainActivity의 라이프사이클이 호출 된 후에 SecondAcitivity가 종료된 것을 알 수 있다. 

 

불투명한 새 액티비티가 최상단으로 올라올 때 

불투명 새로운 액티비티가 최상단으로 올라오면 기존 액티비티는 사용자와 더 이상 상호작용을 할 수 없기때문에, onPause()에 이어 onStop()까지 바로 호출된다.

하지만 onPause()까지만 호출된 상태를 확인하고 싶다면 투명한 새 액티비티를 실행해야한다. 스타일 속성이 투명하다고 선언이 되어 있으면 해당 액티비티는 투명 액티비티라고 간주하고 onPause()까지만 호출된다. 하지만 실제 실행시에는 백그라운드 색상이 투명한 것이 아니기 때문에 불투명하게 보이게 된다. 


https://brunch.co.kr/@mystoryg/80

 

안드로이드 액티비티 생명주기(Life Cycle)

4대 컴포넌트 | 안드로이드 액티비티 생명주기 액티비티는 안드로이드 4대 컴포넌트 중에 하나이다. 그중에서도 UI와 가장 밀접한 관련을 가지고 있기 때문에 사실상 안드로이드 앱에 있어서 가

brunch.co.kr

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

 

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

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

developer.android.com

https://velog.io/@hoyaho/Android-안드로이드-생명주기에-관해-알아보자

 

안드로이드 액티비티 생명주기| Android Basic Knowledge

기본중의 기본, 액티비티의 생명주기에 관해 알아보자

velog.io