안드로이드 개발을 하면서 "생명주기를 잘 관리해주어야 한다" 라는 이야기를 많이 들었는데요,
"생명주기"가 무엇이고, 그 중에서도 액티비티의 생명주기에 대해 알아보려고 합니다!
💡 생명주기란
안드로이드에서 생명주기(Lifecycle)란 Activity 또는 Fragment와 같은 컴포넌트가 생성되고 실행되며 종료되기까지의 과정과 이를 관리하기 위한 상태의 전환을 말합니다
생명주기는 운영체제인 안드로이드 시스템이 관리해주며, 개발자는 이 생명주기 안에서 적절한 작업을 수행해 앱이 안정적으로 동작하도록 해야 합니다 !
공식 문서에 따르면 생명주기를 잘 관리하면 아래와 같은 일들을 방지할 수 있다고 하네요
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
🌟 생명주기의 흐름
생명주기의 흐름은 위의 이미지처럼 5개의 상태와 6개의 이벤트로 이루어집니다
상태는 Activity의 현재 상태를 나타내고, 이벤트는 상태 간 전환을 담당하며 onCreate, onStart 등의 메서드와 연결됩니다
이를 활용하여 상태를 기반으로 효율적으로 리소스를 관리하고, 이벤트를 활용해 적절한 시점에 작업을 실행합니다
상태 (States)
- INITIALIZED: 초기 상태로, Activity가 아직 생성되지 않았음.
- CREATED: onCreate()가 호출된 후, 초기화가 완료된 상태.
- STARTED: onStart()가 호출된 후, UI가 사용자에게 보이는 상태.
- RESUMED: onResume()가 호출된 후, UI가 사용자와 상호작용 가능한 상태.
- DESTROYED: onDestroy()가 호출된 후, Activity가 완전히 종료된 상태.
이벤트 (Events)
- ON_CREATE: INITIALIZED → CREATED
- ON_START: CREATED → STARTED
- ON_RESUME: STARTED → RESUMED
- ON_PAUSE: RESUMED → STARTED (UI가 더 이상 사용자와 상호작용하지 않음)
- ON_STOP: STARTED → CREATED (UI가 화면에서 사라짐)
- ON_DESTROY: CREATED → DESTROYED
예를 들어 앱을 처음 실행하면 Activity는 INITIALIZED 상탸에서 시작하며, `onCreate()` 가 호출되면 CREATED 상태로 전이됩니다. 이후 `onStart()` 와 `onResume()` 을 거쳐 사용자와 상호작용 가능한 RESUMED 상태에 도달하게 됩니다
🌟 Activity의 생명주기
안드로이드는 앱이 실행된 후 다른 액티비티 화면으로 전환되거나, 화면이 꺼지거나 등과 같이 상태 변화가 있을 때마다 액티비티의 생명 주기 메서드를 호출해서 상태 변화를 알려줍니다
메서드에 알아보기 전에 위 그림에 나와있는 액티비티의 상태 4가지에 대해 먼저 알아보도록 하겠습니다
1. Activity launched
- 앱이 실행되거나 Activity가 처음 시작될 때 호출됩니다
- 이 과정에서 onCreate()가 호출되어 Activity의 초기화 작업이 수행됩니다
2. Activity running
- Activity가 실행 중이고, 사용자가 UI와 상호작용할 수 있는 상태입니다
- Activity가 `onResume()` 상태에 도달하면 이 상태에 진입합니다
3. Activity process killed
- 사용 중인 앱이 메모리 부족 등 시스템 이유로 종료되었을 때의 상태를 나타냅니다
- Activity가 다시 시작되면 `onCreate()` 또는 `onRestart()`가 호출됩니다
4. Activity shut down
- Activity가 종료되는 과정을 나타냅니다
- `onDestroy()` 가 호출되며, Activity는 메모리에서 완전히 제거됩니다
이제 7가지 생명주기 메서드를 알아보도록 하겠습니다
onCreate()
Activity의 생성과 함께 가장 먼저 호출되는 콜백으로 이 시점에는 setContentView를 통해 View를 inflate하게 됩니다. (XML로 만든 화면 레이아웃을 코드로 불러와 앱 화면에 표시하는 작업)
이 콜백은 Activity가 메모리 상에 올라갈 때 실행되기 때문에 Activity가 만들어지면서 최초의 단 한 번 실행됩니다. 그렇기 때문에 View와 관련된 작업이나 리소스 초기화같은 작업을 해야 합니다.
- 호출 시점 : Activity가 처음 생성될 때, 필수적
- 역할 : 초기화 작업 (UI 구성, 데이터 초기화 등)을 처리
onStart()
Activity가 사용자에게 보이기 시작할 때 호출되는 콜백으로 Activity가 포그라운드로 올라오며 사용자에게 화면이 보여집니다. 혹은 사용자가 다른 Activity에 있다가 다시 돌아올 때 onRestart() 다음에 호출됩니다.
onStart()에서는 실질적으로 사용자가 스크린을 통해 상호작용하기 전에 필요한 작업들(로그인 관련 상태 확인, 애니메이션 처리 등)이 수행되어야 합니다.
- 호출 시점 : Activity가 사용자에게 보이기 직전에
- 역할 : 화면 갱신 및 UI를 준비
onResume()
onResume이 호출되면 사용자와 상호작용할 수 있습니다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무릅니다. 예를 들어, 앱 사용 중에 전화가 오거나, 사용자가 다른 Activity로 이동하거나, 기기 화면이 꺼지는 이벤트 등이 포커스가 떠나는 것에 해당합니다.
- 호출 시점 : 액티비티가 사용자와 상호작용할 수 있는 상태로 진입할 때
- 역할 : 포커스를 받고, 사용자 입력을 처리
onPause()
사용자가 Activity를 떠나면 onPause가 호출됩니다. Activity가 포그라운드에 있지 않게 되었다는 것을 의미합니다. 다만, 사용자가 멀티 윈도우 모드에 있을 경우에는 Activity가 여전히 보여지고 있을 수 있습니다. Android N (API 24)부터 적용할 수 있었던 멀티 윈도우에서는 창 간의 전환이 발생되면 onResume과 onPause의 전환이 반복적으로 발생됩니다. 즉, 사용자가 멀티 윈도우 상에서 잠시 다른 앱을 사용하게 되면 onPause가 호출되는 것입니다.
앱이 사용자의 관심 밖으로 이동하게 되면 포커스를 잃고(onPause) 관심 안으로 들어오면 포커스를 얻는다(onResume)라고 이해할 수 있습니다
- 호출 시점 : 다른 Activity가 전면에 나타나면서 현재 Activity가 부분적으로 보이거나 숨겨질 때
- 역할 : 빠른 리소스 해제 또는 상태 저장 작업을 처리 (사용자가 작성 중인 메모를 SharePreferences에 저장(간단한 데이터 저장), 애니메이션 해제 등)
onStop()
onStop은 포그라운드에 있던 Activity가 백그라운드로 이동할 때 호출됩니다. 이는 새로 시작된 Activity가 화면 전체를 차지할 경우에 적용됩니다. onStop에서 다음 콜백으로 이동할 수 있는 몇가지 케이스가 존재합니다. 시스템에서 메모리 부족 시 백그라운드 상에 존재하는 앱들을 강제로 종료할 수 있습니다. 그렇기 때문에 메모리에 할당된 리소스들 중 중요한 리소스들의 해제는 이 시점에 하는 것이 좋습니다
- 호출 시점 : Activity가 사용자에게 완전히 보이지 않을 때
- 역할 : 무거운 리소스를 해제하거나, 네트워크 작업을 중단
onDestroy()
Activity가 종료되면서 호출됩니다. 이 콜백이 호출되면 해당 Activity는 스택에서 pop되게 됩니다. 이때 사용자가 활동을 완전히 닫기 위해 Activity를 종료하는 경우도 있지만, 기기 회전 등으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우도 있습니다
- 호출 시점 : Activity가 종료되거나 시스템에서 제거될 때
- 역할 : 메모리 해제 및 정리 작업 수행
onRestart()
사용자가 다른 Activity에 있다가 다시 돌아오는 경우에 onStop, onStart와 함께 호출됩니다
- 호출 시점 : 중지된 Activity가 다시 시작될 때
- 역할 : UI를 다시 준비하거나, 화면 갱신 작업을 수행
🍀 마무리
어떻게 해야 안정성 있는 앱을 개발할 수 있을까에 대한 고민이 많았는데 기본적인 생명주기를 지키는 것이 우선이 되어야 할 것 같다는 것을 많이 느꼈습니다 ㅎㅎ
정확하게 각 메서드 안에서 어떤 역할을 하고 어떤 작업을 해주어야 할지는 잘 몰랐는데 이번에 정리를 하면서 다시 한번 되짚을 수 있었습니다 앞으로 각 생명주기 메서드에서 각각의 역할에 맞게 처리를 해주도록 신경을 써서 개발을 해봐야겠네요..!
'Android' 카테고리의 다른 글
[Android] 앱 배포하기04_ AAB 파일 만들기 (0) | 2024.09.04 |
---|---|
[Android] 앱 배포하기03_ Proguard로 코드 난독화하기 (1) | 2024.09.02 |
[Android] 앱 배포하기02_ 안드로이드 스튜디오 Release build (0) | 2024.08.28 |
[Android] 앱 배포하기01_ 안드로이드 스튜디오에서 APK 서명 키 만들기 (0) | 2024.08.27 |
[Android] PhotoPicker로 권한 없이 갤러리에서 이미지 선택하기 (0) | 2024.06.24 |