1. 생명 주기
1-1. 생명 주기

그동안 안드로이드 구조에 대해 잘 몰랐는데, 알고 보니 안드로이드 앱은 생명 주기가 존재한다.
실제 사용자 입장에서는 앱을 키고 작동하는 것이 전부인데, 실제로는 그 안에서 여러 단계를 거치면서 체계적으로 작동하고 있었다.
앱을 만들 때 생명 주기를 고려하는 것은 필수적이다. 이를 고려하지 않으면 불안정적인 앱이 만들어 질 수 있다.
안드로이드 개발 문서에서 대표적인 예시를 들어주었다.
1. 앱을 사용하다가 다른 앱으로 전환할 때 강제 종료가 되는 경우
2. 앱을 사용하고 있지 않은데 리소스가 낭비되는 경우
3. 앱에서 나갔다가 다시 들어왔는데 사용자의 진행 상태가 저장되지 않은 경우
4. 화면 가로/세로 전환을 할 경우, 강제 종료되거나 진행 상태가 저장되지 않은 경우
이러한 경우가 발생하는 것을 예방하기 위해서라도 생명 주기를 고려하여 앱을 제작해야한다.
1-2. onCreate
반드시 구현해야 하는 메서드.
액티비티가 실행 되면 가장 먼저 실행되는 메서드이다.
setContextView를 활용한 화면 레이아웃 정의, 뷰를 생성하거나 데이터 바인딩 등을 여기서 진행한다.
생명 주기 동안 딱 한 번만 실행되는 메서드.
액티비티 최초 실행 시에만 해야 할 작업을 작성한다.
1-3. onStart
액티비티가 화면에 표시되기 직전에 호출된다.
화면에 진입할 때마다 실행되어야 하는 코드를 작성하면 된다.
1-4. onResume
액티비티가 포그라운드(Foreground)에 나타나면 호출된다.
포그라운드란 사용자가 현재 직접적으로 상호작용하고 있는 앱이나 활동을 의미한다.
예를 들면, 사용자가 앱을 실행하고 화면을 탭하거나 버튼을 누르면 해당 앱이 포그라운드에 나타나고, 사용자가 앱과 상호작용하면 앱은 포그라운드에서 계속 실행된다.
즉, 잠시 액티비티가 일시정지 되어 백그라운드에 있다가 포그라운드로 돌아오는 경우에 onResume이 호출되는 것이다.
만약 액티비티가 재개되었을 때 실행해야하는 코드가 이곳에 작성해야 한다.
또한 안드로이드 공식 문서를 보면 onResume에서 초기화 작업을 할 것이면 onPasues에서 리소스 해제/종료 작업을 하고,
onStart에서 초기화 작업을 할 것이면 onStop에서 리소스 해제/종료 작업을 하기를 권장하고 있다.
1-5. onPasue
액티비티를 방해하는 이벤트가 발생하여 액티비티가 포그라운드에서 벗어나 백그라운드로 이동하거나, 다른 액티비티가 포그라운드로 나타날 때 호출된다.
앱이 일시 중지되는 시점에서 필요한 모든 작업을 수행한다.
예를 들어 , 앱에서 사용하는 데이터를 저장하고, 백그라운드에서 동작하는 서비스와의 연결을 해제합니다. 또한, 앱이 일시 중지될 때 뷰를 일시 중지 상태로 변경하는 등의 UI 처리도 수행한다.
다시 말해서 앱의 중요한 자원들을 해제하고, 데이터를 저장하여 앱이 더 이상 실행되지 않는 상황에서도 데이터를 보존할 수 있도록 한다.
따라서, 사용자에게 민감한 작업을 수행하거나, 시간이 오래 걸리는 작업을 넣으면 안된다. 또한, 빠르게 데이터를 저장하고, 자원을 빠르게 해제하여 앱의 응답성을 유지할 수 있도록 구성해야한다.
만약 무거운 작업을 여기에 집어 넣을 경우 메서드가 완료되기 전에 작업이 끝나지 않을 수 있다고 공식 문서에서 굵은 글씨로 경고하고 있다!
1-6. onStop
액티비티가 사용자에게 더 이상 보이지 않으면 이 메서드가 호출된다.
즉, 다른 액티비티가 포그라운드에 나타나거나, 앱이 종료될 때 호출된다.
onPasue와 달리 완전이 앱이 화면에서 완전히 사라진 후에 작업을 수행하므로 무거운 작업을 수행할 때 적합하다.
물론, onStop에서도 자원 해제나 데이터 저장은 가능하다.
다만, 뷰(View)와 관련된 처리를 하는 것은 권장하지 않는다. 화면이 꺼지면 뷰도 같이 사라지기 때문이다.
1-7. onRestart
백그라운드에서 다시 포그라운드로 복귀할 때, 이 메서드가 호출된다.
onStart와 onStop 사이에 존재하는데, 따라서 앱의 초기화나 데이터 복원 등과 같은 필수적인 작업만 수행하면 된다.
호출되는 빈도는 그만큼 적다.
1-8. onDestroy
앱을 종료하는 경우 호출이 된다.
onStop에서 아직 해제하지 못한 리소스 작업을 수행하면 적합하다.
다만, 메모리가 부족하면 메서드 호출이 이뤄지지 않고 종료될 수 있는 경우가 있어 이에 유의하여야 한다.
그러므로 무거운 작업이나 UI 작업은 하지 않는 것을 추천하며, 데이터베이스 연결이나, 네트워크 연결 등을 모두 닫아주는 일을 하는 것이 적합하다.
| 액티비티 상태 | 종료될 확률 |
| Created Started Resumed |
낮음 |
| Paused | 중간 |
| Stoped Destroyed |
높음 |
2. 실제 실행 순서(다른 블로그 참고)
2-1. 앱을 실행할 때
onCreate - onStart - onResume
2-2. 홈 화면으로 나갔을 때(종료가 아님)
onPause - onStop
2-3. 앱으로 다시 돌아왔을 때
onRestart - onStart - onResume
2-4. 앱을 종료했을 때
onPause - onStop
2-5. 첫 번째 activity -> 두 번째 activity 이동
파란색 : 첫 번째 activity
초록색 : 두 번째 activity
onPause - onCreate - onStart - onResume - onStop
2-6. 두 번째 activity -> 첫 번째 activty 돌아가기
파란색 : 첫 번째 activity
초록색 : 두 번째 activity
onPause - onRestart - onStart - onResume - onStop - onDestory
'Kotlin > 개념 정리' 카테고리의 다른 글
| 개념 정리 : 데이터 바인딩 (0) | 2023.02.17 |
|---|---|
| 개념 정리 : 뷰 바인딩 (0) | 2023.02.17 |
| 개념 정리 : 코루틴 (0) | 2023.02.17 |
| 개념 정리 : ViewPager - 기본 (0) | 2023.02.16 |
| 개념 정리 : 콜백 함수(Callback Function) (0) | 2023.02.16 |