Apple is Apple
article thumbnail
Published 2023. 8. 2. 12:20
[Android] Activity Lifecycle Android

개요

안드로이드 개발에서 액티비티 생명주기는 앱의 실행과 종료 과정을 이해하는 데 핵심적인 개념이다. 액티비티는 4대 컴포넌트 중 하나이며 사용자와의 상호작용(UI, UX)에 밀접한 관련이 되어있다. 따라서 사용자 경험에 직접적인 영향을 미치는 중요한 역할을 수행한다.

 

Youtube앱을 봐보자. 앱을 들어가면 처음 로고가 보이는 화면도 액티비티이고 로고가 내려가고 영상 목록이 보이는 화면도 액티비티이다. (하단 탭에서 메뉴를 클릭하면 화면이 바뀌는데 이것은 프래그먼트로 구성된 것 일 수도 있다.)

이렇게 안드로이드 앱은 많은 액티비티로 구성되어 있다.

이런 액티비티의 생명주기를 갖고 이는 다섯 가지의 주요 상태로 구성된다. 처음 앱이 실행되면 액티비티가 생성되고 시작된다. 이후 액티비티는 사용자와 상호작용하면서 실행(running) 상태로 전환된다. 활동 상태에서 앱이 다른 액티비티나 앱이 전환되면 일시 중지(pause)되거나 정지(stop)될 수 있다. 그리고 필요에 따라 시스템에서 액티비티를 종료(destroy)하거나 다시 생성하는 과정(restart)이 반복된다.

액티비티 생명주기의 이해는 앱 개발자에게 매우 중요하다. 사용자가 앱을 실행하거나 백그라운드로 전환하는 등 다양한 상황에서 액티비티의 상태 변화에 따라 적절한 처리를 해야 한다. 예를 들어, Youtube 영상을 보다가 홈버튼을 누르면 앱 바깥으로 나가게 되는데 다시 들어올 경우 처음부터 다시 보게 되면 사용자 경험에 있어 좋지 않은 경험이 될 것이다. 그렇기 때문에 앱이 일시 중지되거나 정지된 상태에서 다시 실행되는 경우 등 다양한 경우에서 앱의 데이터를 유지하거나 복구하는 등의 작업이 필요할 수 있다. 

또한, 액티비티 생명주기를 제대로 관리하지 않으면 메모리 누수나 앱의 비정상적인 종료 등의 문제가 발생할 수 있다. 이로 인해 사용자 경험이 저하되거나 앱의 성능에 영향을 미칠 수 있다.

따라서, 안드로이드 앱 개발자는 액티비티 생명주기를 꼼꼼히 이해하고, 적절한 상태 관리와 리소스 관리를 통해 사용자에게 원활하고 안정적인 앱을 제공해야 한다. 이를 통해 사용자가 앱을 편리하게 이용할 수 있으며, 앱의 사용성과 성능을 향상할 수 있다.

 

 

Activity Lifecycle

Lifecycle 들여다보기

life cycle - android developer

전체적인 구조 도이고 여기 안에서도 액티비티 동작에 따라 3가지로 세분화를 해볼 수 있다.

1. 액티비티 생성 과정

액티비티 생성

액티비티 생성 시 해당 메서드들이 순차적으로 호출되고 Actitivt는 running 상태가 된다.

onCreate(): 내부의 setContentView함수에 의해 레이아웃이 메모리에 올라감. ON_CREATED 상태로 변경

onStart(): 액티비티가 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비. 매우 빠르게 완료됨

onResume():  앱이 사용자와 상호작용, 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무름

 

 

2. 액티비티가 사라질 때 과정

액티비티 사라짐

onPause(), onStop(): 뒤로가기 등으로 인해 액티비티가 포그라운드에서 사라짐 

onDestroy(): 액티비티가 메모리에서 제거됨. onPause, onStop에서 제거되지 않은 리소스들을 제거

 

 

3. 한 액티비티에서 다른 액티비티로

onPause(), onStop(): 기존의 액티비티는 stop 상태로 전환

onStart(), onResume(): 새로운 액티비티가 시작되고 lifecycle 흐름대로 실행됨

onRestart(): 새로운 액티비티에서 기존의 액티비티로 돌아감

 

 

 

수명주기 메소드 들여다보기

onCreate()

더보기

시스템이 먼저 활동을 생성할 때 실행되는 것으로, 필수적으로 구현해야 함. 액티비티가 생성되면 ON_CREATED 상태가 됨.

onCreate() 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행

ex) 데이터를 목록에 바인딩, 액티비티와 ViewModel과 연결, 일부 클래스 범위 변수를 인스턴스화.

 

setContentView 메서드를 호출하여 액티비티의 layout을 지정함

 

이 메서드는 savedInstanceState 매개변수를 수신하는데, 이는 액티비티의 이전 저장 상태가 포함된 Bundle 객체입니다. 이번에 처음 생성된 활동인 경우 Bundle 객체의 값은 null

onStart()

더보기

onStart()가 호출되면 액티비티가 사용자에게 표시되고 ON_START 상태가 됨,  앱은 액티비티를 포그라운드에 보내 상호작용할 수 있도록 준비함

예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화합니다.

onStart() 메서드는 매우 빠르게 완료되고, ON_CREATED 상태와 마찬가지로 액티비티는 ON_START 상태에 머무르지 않습니다. 이 콜백이 완료되면 활동이 재개됨 상태에 들어가고, 시스템이 onResume() 메서드를 호출함

onResume()

더보기

이 상태에 들어갔을 때 앱이 사용자와 상호작용을 함. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무름.

ex) 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트

방해되는 이벤트가 발생하면 활동은 일시중지됨 상태에 들어가고, 시스템이 onPause() 콜백을 호출

액티비티가 ON_PAUSE상태에서 ON_RESUME 상태로 돌아오면 시스템이 onResume() 메서드를 다시 한번 호출

따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 액티비티가 ON_RESUME 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 함

onPause()

더보기

시스템은 사용자가 액티비티를 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출(단, 해당 액티비티가 항상 소멸되는 것은 아님)

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


액티비티가 ON_PAUSE 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_PAUSE 이벤트를 수신합니다. 여기서 수명 주기 구성요소는 구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있음(예: 카메라 미리 보기 정지).

또한 onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들(예: GPS) 또는 액티비티가 일시중지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있음. 그러나 앞서 onResume() 섹션에서 언급했듯이 일시중지된 활동은 멀티 윈도우 모드에서 여전히 완전히 보이는 상태일 수 있습니다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋음

onStop()

더보기

액티비티가 사용자에게 더 이상 표시되지 않으면 ON_STOP 상태에 들어가고, 시스템은 onStop() 콜백을 호출

이는 예를 들어 새로 시작된 액티비티가 화면 전체를 차지할 경우에 적용됩니다. 또는 시스템이 액티비티의 실행이 완료되어 종료될 시점에 onStop()을 호출할 수도 있음

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

onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야 함
또한 onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 함

onDestroy()

더보기

onDestroy()는 액티비티가 소멸되기 전에 호출됨.

시스템은 다음 중 하나에 해당할 때 이 콜백을 호출함

    1. 사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 액티비티가 종료되는 경우

    2. 구성 변경(예: 기기 회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 액티비티를 소멸시키는 경우

 

활동이 소멸됨 상태로 전환하면 이 활동의 수명 주기와 연결된 모든 수명 주기 인식 구성요소는 ON_DESTROY 이벤트를 수신합니다. 여기서 수명 주기 구성요소는 액티비티가 소멸되기 전에 필요한 것을 정리

ex) 해제가 안된 메모리 해제, 백그라운드 종료 등등..

 

 

정리

이렇게 안드로이드 앱은 많은 액티비티를 가지면서 그 안에서는 생명주기에 맞게 동작을 하게 된다.

Acitivty Lifecycle을 이해하고 적용하면서 적절한 상태 관리와 리소스 관리를 통해 사용자에게 원활하고 안정적인 앱을 제공해하여 사용자가 앱을 편리하게 이용할 수 있으며, 앱의 사용성과 성능을 향상할 수 있도록 해야 할 것이다.

 

다음 포스팅에서는 안드로이드 스튜디오를 통해 액티비티를 전환해 가면서 어느 시점에 어느 콜백이 불리는지 직접 한번 확인해 보도록 하겠다.

 

 

 

ref.

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

 

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

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

developer.android.com

 

profile

Apple is Apple

@mjjjjjj