728x90


Activity는 안드로이드 4대 컴포넌트 중 하나이다. 그중에서도 UI와 가장 밀접한 관련이 있기 때문에 안드로이드 앱에 있어서 가장 기본이 되는 구성 요소이다. 

만약 A라는 어플을 보고 있다가 B라는 어플을 켰을 때 당연하게도 A어플은 더 이상 화면에 보이지 않고 B어플이 보이게 된다. 이 때 A어플과 B어플은 각자의 생명주기에 따라 호출되는 함수들이 존재한다.

 

📌  생명주기란?

Lifecycle은 Life + cycle의 합성어이다. 말 그대로 앱이 탄생하고 진행되며 죽음(?)에 이르기까지의 과정이라고 생각하면 된다. Activity, Fragment, Service 총 세 가지 종류의 Lifecycle이 존재한다.

 

Activity 생명주기

Activity의 Lifecycle 순서도

 

기본적으로 Lifecycle 은 위에서 아래 방향으로 진행된다. 이를테면 Activity 가 백스택에 최상단으로 올라왔을 경우에는 생명주기가 CREATED - STARTED - RESUMED 순으로 진행되고, 반대로 백스택에서 pop 됐을 경우에는 PAUSED - STOP - DESTROYED 순으로 진행되게 된다.

 

onCreate()

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

onStart()

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

onResume()

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

onPause()

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

onStop()

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

onDestroy()

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

onRestart()

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

 

 

🚨 여기서 onPause와 onStop이 헷갈릴 수 있다. 

 

모든 생명주기 관련 메서드들에 Log를 찍고 뒤로 가기 및 홈으로 나가기를 해봐도 onPause과 onStop은 동시에 실행될 뿐 onPause만 실행되는 경우는 없었기 때문이다.

 

확인해 보기 위해 간단한 프로젝트를 만들어 onPause만 실행되는 예시를 구현해 보았다.

 

MainActivity에서 SubActivity로 전환

 

MainActivity에서 SubActivity로 전환하는데 이때의 theme을 투명으로 설정해 주어 MainActivity가 뷰에서 사라지지 않도록 한다. 이때 Log를 찍어 확인해 보면

 

 

onStop이 아닌 onPause까지만 출력된 것을 확인할 수 있다.

새로 호출되는 Activity의 스타일 속성이 투명하다고 선언되어 있으면 해당 Activity는 투명 Activity로 간주하고 앱은 onPause 까지만 호출하게 된다.

 

 

 

다이얼로그의 경우는 어떨까?

 

MainActivity에서 다이얼로그를 띄웠을 때 Log

MainActivity에서 다이얼로그를 띄우면 MainActivity가 최상단이 아니므로 onPause가 호출되어야 할 것 같지만 다이얼로그는 Activitiy의 일부이기 때문에 아무런 함수가 출력되지 않는다.

 

 

 

 

 

 

📌  상황에 따른 생명 주기 호출

 

📖  Activity 생성

 

 

  • onCreate() → 생성된 화면 구성요소를 메모리에 로드
  • onStart(), onResume() → 화면의 구성요소를 나타내고 사용자와 상호작용 시작(Resumed: 실행 중)

 

 

 

📖  Activity 화면에서 제거

 

 

  • onPause(), onStop() → 뒤로 가기, finish()를 실행할 때 동시에 실행
  • onDestory() → 최종적으로 액티비티가 메모리에서 제거

 

 

 

 

📖  Activity를 종료하지 않고 다른 Activity 실행

 

 

 

  • onPause(), onStop() → 현재 액티비티를 종료하지 않고 새로운 액티비티가 만들어질 때(Stopped)
  • onStart(), onResume() → 두 메서드가 연속적으로 실행되고 Resumed 상태로 변경

 

 

 

 

📖  Activity가 모두 가려지지 않은 상태에서 다른 Activity 실행

 

 

 

  • onPause() → 완전히 사라진 것은 아니므로 Paused 상태로 변경
  • onResume() → 정지가 아니니 onStart를 거치지 않고 바로 onResume로 Resumed

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference:

https://developer.android.com/guide/components/activities/activity-lifecycle

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

https://bbaktaeho-95.tistory.com/62

https://kairo96.gitbooks.io/android/content/ch2.4.1.html

https://stickode.tistory.com/5

 

복사했습니다!