[안드로이드] Activity Lifecycle

김민규·2021년 9월 15일
4

안드로이드

목록 보기
1/4

어이가 없다. 방금 분명 포스팅했는데 아까전에 지웠던 내용들까지 같이 올라가버려서
다 지우고 다시 쓰는중이다. 임시저장 기능이 제대로 실행되지 않는건지 저장도 되지 않았다.

열받지만 각설하고, 이번 포스팅에서는 안드로이드 4대 컴포넌트 중 하나인 Activity의 lifecycle에 대해 설명한다. 아주 기초적이지만 핵심적인 부분이라 백번 읽고 자다가 잠꼬대로 줄줄 뱉을 정도로 체득해야한다.


생명주기(Lifecycle)

1) 생명주기란 무엇인가?

Lifecycle은 Life + cycle의 합성어로, 삶의 순환이라고 직역할 수 있겠다. 말 그대로 탄생하고 성장하여 죽음에 이르기까지의 과정이라고 생각한다면, 이것을 안드로이드 앱에 적용한 것이 바로 Android Lifecycle이다. Activity, Fragment, Service 총 세가지 종류의 Lifecycle이 있으며 오늘은 그 중 Activity의 Lifecycle에 대해서만 포스팅하도록 하겠다.

2) 생명주기가 필요한 이유

예를 들어보자. 당신은 지금 여자친구와 카톡을 하고 있다. 그런데 갑자기 친구가 술먹자며 나오라고 전화를 했다. 당신이 전화를 받는순간 전화창이 화면에 보일 것이다. 그러다 약속을 잡고 전화를 끊고 다시 카톡을 실행하면 화면에 카톡창이 보일 것이다.

위 예시를 보자.
카톡 실행중 -> 카톡 닫고 전화 실행 -> 전화 실행중 -> 전화 끊고 카톡 실행 -> 카톡 실행중
위와 같은 로직이 나오게 된다. 사용자들은 그저 실행과 종료를 통해 해당 로직을 파악할 수 있지만, 우리의 안드로이드는 그러지 못한다. 그렇기에 Lifecycle이라는 개념을 넣어 안드로이드 프로그램의 상태 변화를 파악하고 반응할 수 있게 한 것이다.


액티비티 생명주기(Activity Lifecycle)

위 사진은 안드로이드 4대 컴포넌트 중 하나인 Activity의 Lifecycle 순서도이다.


1) onCreate()

  • Activity가 생성되면 가장 먼저 호출됨
  • 화면 Layout 정의, View 생성, Databinding 등은 이곳에 구현함
  • 생명주기 통틀어서 단 한 번만 수행되는 메소드
  • 따라서 Activity 최초 실행에 해야하는 작업을 수행하기에 적합함

2) onStart()

  • Activity가 화면에 표시되기 직전에 호출됨
  • 화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현함

3) onResume()

  • Activity가 화면에 보여지는 직후에 호출됨
  • 현재 Activity가 사용자에게 포커스인 되어있는 상태

4) onPause()

  • Activity가 화면에 보여지지 않은 직후에 호출됨
  • 현재 Activity가 사용자에게 포커스아웃 되어있는 상태
  • 다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함
  • 영구적인 Data는 이곳에 저장

5) onStop()

  • Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
  • 홈 키를 누르는 경우, 다른 액티비티로의 이동이 있는 경우가 있음
  • 이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출됨

6) onDestroy()

  • Activity가 완전히 종료되었을 때 호출되는 메소드
  • 사용자: finish(), onBackPressed()(기존 액티비티의 onResume()까지 호출된 후 onDestroy() 호출)
  • 시스템: 메모리부족(프로세스 종료)
  • onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있음

7) onRestart()

  • onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
  • onRestart()가 호출된 이후 이어서 onStart()가 호출됨


이어지는 간단한 예제풀이를 통해 애매한 부분을 깨닫고 확실하게 이해하시길 바랍니다.


생명주기 예제

1) LoginActivity에서 RegisterActivity를 호출했을 때 라이프 사이클 호출 순서를 나열하시오.

2) RegisterActivity 종료 후 다시 LoginActivity가 보여질 때 라이프사이클 호출 순서를 나열하시오.


답은 포스팅 맨 아래에 있습니다.

한번 자신이 얼마나 이해했는지 풀어보는게 도움이 많이 됩니다.




















예시 1번 답

[login] onPause()
[register] onCreate()
[register] onStart()
[register] onResume()
[login] onStop()

  • registerActivity를 호출하면 우선 loginActivity를 onPause()합니다.
  • 그런 다음 registerActivity를 onCreate()하고,
  • 생성된 registerActivity를 onStart()하고,
  • 시작한 registerActivity를 onResume()합니다.
  • registerActivity가 onResume()되며 포커스인 상태이기 때문에, 비로소 loginActivity는 onStop() 상태에 들어가게 됩니다.

예시 2번 답

[register] onPause()
[login] onRestart()
[login] onStart()
[login] onResume()
[register] onStop()
[register] onDestroy()

  • 다시 loginActivity를 호출하면 우선 registerActivity를 onPause()합니다.
  • loginActivity는 onDestroy()되지 않고 onStop() 된채로 백그라운드에서 돌아가고 있기 때문에, onRestart()를 수행합니다.
  • 그런 다음 onRestart()된 loginActivity를 onStart()하고,
  • onStart() 상태의 loginActivity를 onResume()합니다.
  • loginActivity가 onResume() 상태가 되어 사용자가 registerActivity로부터 포커스아웃 되었기 때문에 비로소 registerActivity는 onStop() 상태가 됩니다.
  • registerActivity를 종료하면 onDestroy() 호출 후 완전히 종료됩니다.

오늘은 Android Lifecycle 중 가장 기초적인 Activity Lifecycle에 대해 알아봤습니다.
다음 포스팅에서는 Fragment Lifecycle에 대해 알아보겠습니다. 뭐든지 기초가 탄탄해야한다는 옛 말이 틀린게 하나 없네요. 특히나 안드로이드 공부하면서 더욱 크게 느끼는 것 같습니다.


profile
키보드를 좋아합니다.

1개의 댓글

comment-user-thumbnail
2024년 7월 17일

백 번 읽고 자다가 잠꼬대로도 읊어야 한다는 멘트에 무릎을 치고 갑니다.... ! 정신차리게 되네요

답글 달기