1. 서론
안드로이드 스튜디오에서 개발하는 안드로이드 앱은 다양한 생명주기를 갖는데 이중 특히 대표되는 생명주기로 크게 Activity와 Fragment 가 있습니다. 이 중 안드로이드 4대 컴포넌트이며 이번 주제의 액티비티 생명주기, Activity LifeCycle에 대해 설명을 해보려고 합니다
2. 액티비티 생명주기 ( Activity LifeCycle ) 이란?
사람이 태어나고 죽기까지의 생명 주기, 그 과정이 있듯이 액티비티 또한 생명주기를 가지고 있습니다.
앱은 사용자에 의해 시작이 되고 사용중에 잠시 멈추거나 다시 시작이 되며, 마지막에는 종료가 됩니다.
이 처럼 액티비티가 시작되고 완전히 종료가 되기까지의 주기 안에서 액티비티의 상태가 계속 바뀌는 것을
액티비티 생명주기 ( Activity Lifecycle )이라고 합니다.
우리 안드로이드 개발자들은 액티비티가 안전하게 종료가 될 수 있도록 생명 주기 콜백을 잘 설정해줘야 합니다.
만약 생명 주기 콜백을 잘 구현하지 못한다면 아래와 같은 문제들이 발생할 수 있습니다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
안드로이드 프레임워크에서는 액티비티의 상태가 변화할 때마다 특정 동작들을 잘 수행할 수 있도록 여러 콜백 메서드들을 제공해 줍니다.
지금부터 생명주기의 순서와 콜백 메서드들에 대해 얘기해보려 합니다.
3. 액티비티 생명주기 시각자료
Activity는 6가지의 콜백으로 구성된 핵심 집합인 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()를 제공합니다.
이 콜백 메서드들은 액티비티가 새로운 상태로 전환이 될 때마다 호출합니다.
다만, 앱의 특성에 따라서 모든 콜백 메서드들을 구현할 필요가 없을 수가 있습니다.
하지만 안정적인 앱을 만들기 위해 이 생명주기를 이해할 필요가 있습니다.
4. 액티비티 생명주기 콜백 메서드 ( Activity LifeCycle Callback Method )
콜백 메서드들에 대해 설명을 하기 전에 간단하게 흐름을 알려드리려고 합니다.
생명주기 그림을 보시다시피 onCreate() → onStart() → onResume()의 과정을 거치고 난 후 액티비티가 활성화가 됩니다.
그 후 만약 다른 액티비티에 의해 보이는 액티비티의 화면이 일부 가려지게 되면 onPause() 메서드가 실행이 되고 보이는 액티비티의 화면이 전체가 가려지면 onStop()이 실행이 됩니다.
그리고 액티비티를 종료하게 되면 onDestory()가 실행이 되면서 액티비티가 파괴(소멸)가 됩니다.
4 - 1. onCreate()
시스템이 액티비티를 생성할 때 호출이 되며 ‘CEATED’ 상태가 됩니다.
다른 콜백 메서드와는 다르게 필수적으로 꼭 구현을 해야 하는 메서드이며 액티비티 전체 생명주기 동안 딱 한 번만 실행이 됩니다.
이곳에서 RecyclerView에 데이터 바인딩 또는 ViewModel에 연결할 수 있고 View.OnClickListener, 레이아웃 선언 등을 할 수 있습니다.
다만, setContentView()를 통해 XML 레이아웃 파일을 넘겨주어 화면에 레이아웃을 보여주는 것이기에
setContentView()는 onCreate()에 종속되는 메서드 이므로 꼭 해당 콜백 메서드 안에 구현해야 합니다.
onCreate() 메서드의 동작이 끝나면 앱이 종료가 되는 것이 아닌 ‘STARTED’ 상태가 되고 이후 onStart()와 onResume() 메서드를 연달아 호출합니다.
4 - 2. onStart()
onCreate()의 동작이 끝나면 ‘STARTED’ 상태가 되며 onStart() 메서드를 호출하게 됩니다.
이 메서드를 호출하게 되는 순간부터 액티비티의 화면이 사용자에게 보이게 되고 앱의 활동이 포그라운드로 전환이 되어 사용자와 상호작용할 수 있도록 준비합니다.
포그라운드란?
백그라운드와 비교하여 쉽게 설명하자면 포그라운드는 화면이 보이는 곳에서 작업을 하는 것이고 백그라운드는 화면이 안 보이는 곳에서 무엇인가 작업을 하는 것이라고 볼 수 있습니다.
onStart()는 앞서 말한 것처럼 그저 화면은 보이지만 아직 버튼등이 안 보이고 클릭할 수 없는 그저 준비 단계이며 매우 빠른 속도로 실행이 되고 완료가 되며 액티비티가 ‘RESUMED’ 상태로 전환이 되면서 onResume() 메서드를 호출합니다.
4 - 3. onResume()
onStart()의 실행이 완료가 되면 ‘RESUMED`상태로 전환되면서 메서드를 호출합니다.
이때부터 포그라운드에 액티비티가 표시가 되며 사용자와 상호작용을 할 수 있습니다.
이제부터 특별한 상황( 앱을 사용하다가 전화가 오거나 핸드폰 화면만 잠깐 껐을 때 등 )이 아니라면
앱은 ‘RESUMED’ 상태에 머무르게 됩니다.
만약, 앞서 말한 특별한 상황 즉, 방해가 되는 이벤트가 생긴다면 ‘PAUSED’ 상태가 되고 시스템은 onPause() 콜백 메서드를 호출하게 됩니다.
여기서 중요한 점은 특별한 상황, 전화를 다 받고 다시 앱에 돌입을 했을 때 다시 ‘RESUMED’ 상태로 돌아오면서 시스템은 다시 한번 onResume() 메서드를 호출하게 됩니다.
따라서 특별한 상황을 고려하여 onResume() 메서드를 구현해서 onPause() 중에 해제하는 구성요소들을 초기화하고 상태가 ‘RESUMED’로 전환될 때마다 발생하는 것들에 대해 필요하다면 초기화 작업을 해줘야 합니다.
4 - 4. onPause()
사용자가 잠시 액티비티를 떠나거나 화면의 일부가 가려졌을 때 ‘PAUSED’ 상태가 되며 이 메서드가 호출이 됩니다.
( 여기서 화면의 일부가 가려졌다는 것은 대화 상자 같은 반투명 활동이 열렸을 때 등을 의미합니다. )
즉, 해당 액티비티가 포그라운드에 있지 않게 되었다는 것을 의미합니다.
( 다른 액티비티에 포커스를 둔 상태 )
다만, 멀티 윈도우 모드 ( 두 앱을 동시에 구동할 수 있는 모드 )의 경우 액티비티가 포그라운드에 있으면서 onPause()를 호출합니다.
따라서 onPause()는 언젠가 다시 시작할 작업을 일시중지해 줍니다.
또 onPause() 메서드를 사용하여 GPS와 같은 센서핸들 활동들을 잠시 일시중지 하여 앱 사용자의 배터리 수명을 연장시킬 수 있습니다.
여기서 중요한 것은 onPause는 아주 잠깐 실행되기에 사용자의 데이터저장, 네트워크 호출등과 같은 무거운 작업을 하면 안 됩니다. 이렇게 무거운 작업은 onStop()에서 해주면 됩니다.
다시 액티비티가 재개가 된다면 ‘PAUSED’ 상태에서 ‘RESUMED’ 상태로 전환되며 onResume() 메서드를 호출합니다. 이때 액티비티 인스턴스에 남아있던 메모리를 다시 호출해 줍니다.
4 - 5. onStop()
액티비티 화면이 사용자에게 더 이상 보이지 않게 되면 ‘STOPPED’ 상태가 되며 onStop() 콜백 메서드가 호출이 됩니다.
보통 새로 시작된 액티비티가 화면을 전체다 차지할 경우 발생합니다.
또한 액티비티의 실행이 완료되어 종료될 시점에 onStop() 메서드를 호출할 수도 있습니다.
특히, 애니메이션등 UI 관련 마무리 작업은 onStop()에서 해야 합니다.
앞서 얘기했던 무거운 작업( DB에 데이터저장, 네트워크 호출 등)은 여기서 해주면 됩니다.
여기서 주의할 점은 아무리 액티비티가 ‘STOPPED’ 상태여도 액티비티 객체는 메모리 안에서 머무릅니다.
다만 시스템이 더 우선순위가 높은 프로세스를 위해 메모리를 확보해야 한다면 해당 액티비티를 메모리 상에서 죽이게 됩니다.
하지만 Bundle에 View객체 상태를 그대로 저장해 둔 상태라서 사용자가 이 액티비티로 다시 돌아오게 된다면 이를 기반으로 상태를 복원해 줍니다.
만약 사용자가 다시 이 액티비티로 돌아온다면 ‘STOPPED’ 상태에서 다시 시작이 되며
onRestart() → onStart() → onResume() 이 연달아 호출이 되면서 마지막엔 ‘RESUMED’ 상태로 전환하게 됩니다.
4 - 6. onDestroy()
사용자에 의해 또는 시스템 등에 의해 완전히 실행이 종료가 되면 ‘DESTROYED’ 상태가 되며 이 메서드가 호출이 됩니다.
정확히는 액티비티가 완전히 소멸되기 바로 직전에 이 메서드가 호출이 됩니다.
아래와 같은 경우 액티비티가 완전히 소멸이 됩니다.
예를 들어 finish()가 호출되거나 사용자가 앱을 종료했을 경우,
또는 기기 회전 (가로/세로)등 일시적으로 액티비티가 소멸되는 경우가 있습니다.
다만 기기 회전등으로 일시적으로 액티비티가 소멸이 된다면 시스템이 즉시 새롭게 변경된 액티비티 인스턴스를 생성하여 onCreate()를 호출합니다.
여기서 중요한 것은
onDestroy() 메서드가 호출되기 전까지 해제하지 않은 리소스가 있다면 이 메서드에서 모두 해제해줘야 합니다. 그렇지 않으면 Memory Leak이 발생할 위험이 있습니다.
이후 액티비티는 완전히 소멸되게 됩니다.
포스팅을 마치면서...
포스팅하는데 몇 시간을 쏟아부었는지 모르겠습니다...
그만큼 중요하며 안드로이드 개발자로서 기본적으로 알고 넘어가야 할 부분이라 최대한 저만의 방식으로 풀어서 적어 보았습니다.
그 과정 속에서 다시 한번 공부가 되어서 이렇게 포스팅을 한다는 게 너무 의미가 있네요!
만약 안드로이드 개발을 처음 하시는데 이 내용부터 보신다면 무슨 소리인지.. 많이 어려우실 겁니다.
가장 중요한 건 이런 콜백 메서드 중 저희는 반드시 구현이 필요한 onCreate()는 많이 접해 보셨을 겁니다.
계속 공부해 나가면서 많은 상황들을 접해보시고 자신만의 방식으로 이런 생명주기들을 공부하면서 포스팅해보는 것을 정말 추천합니다.
우리 모두 꿈을 위하여 파이팅!!!!
'Android Studio > - Programming' 카테고리의 다른 글
[안드로이드] 4대 컴포넌트 (0) | 2024.05.13 |
---|---|
[안드로이드/viewBinding] 뷰바인딩은 무엇이고 어떻게 사용할까? (0) | 2024.04.30 |
[안드로이드/Regex] 정규표현식, 회원가입 유효성 검사 (0) | 2024.04.08 |
[코틀린] lateinit과 by lazy의 차이점 (0) | 2024.03.29 |
[코틀린/OOP] OOP (객체지향 프로그래밍) 란 무엇인가? (0) | 2024.03.25 |
주코딩의 개발 노트!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!