Activity와 Fragment의 생명주기 (1) - Activity

KwangYoung Kim·2022년 4월 14일
0

Android

목록 보기
4/4
post-thumbnail

들어가며

앱을 만드는데 있어서 생명주기에 대한 이해는 필수적이다.
Activity와 Fragment의 상태 변화에 맞춰 적절히 작업을 해주어야 의도치 않은 충돌이나 낭비되는 리소스 문제를 막을 수 있다.

각 상태 변화에 따라 콜백 메소드가 작동하는 데 어떤 시점에 어떻게 작동하는 지 알고 어떤 시점에 어떻게 작업해줘야 하는지 알고 있어야 좋은 앱을 만들 수 있다.

Activity와 Fragment는 각각의 생명주기 메소드들을 가지고 있는데 각각 상태에 따라 어떻게 작동하는 지 정리해보려고 한다.

Activity

Activity는 7개의 생명주기 콜백 메소드를 제공한다.

onCreate(), onStart(), onResume(), onRestart(), onPause(), onStop(), onDestroy()

onCreate()

Activity의 생명주기 중 가장 많이 접하게 되는 메소드이다. Android Studio에서 Activity를 만들게 되면 기본적으로 오버라이딩 되어 있다.
이 곳에서는 Activity의 전체 생명 주기 중 한번만 발생해야 하는 작업을 하기에 적당하다.
예를 들어 클래스 영역의 변수를 초기화하고 ViewModel을 연결하고 setContentView()에 레이아웃 리소스 ID를 넘겨 UI를 구성할 수 있다.

또한 이곳에서 savedInstanceState라는 Bundle 객체를 매개변수로 넘겨받게 되는데 화면이 회전하여 Activity가 종료된 후 다시 시작하는 경우 이전 데이터를 저장하여 넘겨줄 수 있다. 만약 Activity가 처음 생성된 것이라면 null로 넘어오게 된다.

onCreate()가 모두 실행되면 onStart()가 이어서 실행된다.

onStart()

이 단계에서는 앱이 Activity를 포그라운드로 보내 사용자와의 상호작용을 준비한다. 화면이 보이기 직전에 호출된다.

메소드가 완료된 후에는 onResumse()을 호출하게 된다.

onResume()

화면이 사용자와 상호작용을 하기 직전에 호출되며 이 단계가 마무리 되면 우리가 사용하는 앱의 형태로 앱과 상호작용을 할 수 있다.
Activity에서 포커스가 떠나기 전까지 이 상태에 머물며 포커스가 떠나면 onPause()를 호출하게 되는데 이상태에서 다시 화면이 포커스를 받게 되면 onResume()이 실행된다. 쉽게 말해 다른화면이 보여지고 다시 해당 화면이 보여질 때 실행된다.

때문에 화면이 보여질 때마다 실행해줘야 하는 작업이 있다면 이곳에서 작업을 하게하면 된다.

onPause()

Activity가 포커스를 잃고 해당 화면을 떠나게 되는 첫 시작점이다. 하지만 Activity가 소멸되지는 않고 일시 중지된 상태이다.
계속 실행되어서는 안되지만 다시 시작할 여지가 있는 작업을 이곳에서 중지시키거나 조정하기에 좋다.

해당 메소드는 다음 상황에서 발생한다.

  • 일부 이벤트가 앱 실행상황을 방해할 때
  • 멀티 윈도우 상황에서 한 앱만 포커스를 가져갈 수 있으므로
  • 반투명 Activity가 실행될 때

이 메소드 실행시간은 매우 짧아서 네트워크 통신 등 무거운 작업을 하기에는 무리가 있다. 또한 멀티 윈도우 상황에서는 화면이 보일 수 있기 때문에 UI 리소스에 대한 작업을 해제하거나 조정할 때 등 이러한 작업들은 onStop()에서 하는 것이 좋다.

onStop()

Activity가 화면에서 보이지 않게 되면 실행된다.(예를 들어 다음 화면이 실행되고 현재 화면이 아예 보이지 않는 상태가 되었을 때)
onPause() 부분에서 말했듯이 Activity가 화면에 보이지 않을 때 불필요한 리소스를 해제하고 조정하는 작업을 하기에 알맞다.
애니메이션을 정지시키고 세밀한 위치 업데이트에서 대략적인 위치 업데이트로 변경하거나 데이터베이스에 데이터를 저장하는 무거운 작업을 하기에 좋다.

해당 메소드가 실행되고 다시 화면으로 돌아오게 된다면 onRestart()가 실행되고 onStart()를 거쳐 onResume()을 호출하여 다시 유저가 앱과 상호작용할 수 있게된다.

onDestroy()

Activity가 소멸되기 직전에 호출된다. 이 메소드는 두가지 상황에 의해서 호출된다.

  1. 사용자가 화면을 닫거나 finish()메소드가 호출된 경우
  2. 구성 변경(화면회전이나 멀티윈도우 등)으로 인해 시스템이 일시적으로 소멸시키는 경우

이 두가지는 isFinishing() 메소드에 의해서 구분지을 수 있다.
(1번 상황에서는 true, 2번 상황에서는 false)

onRestart()

중단된 상태의 Activity가 다시 시작되기 전에 호출된다. 이 메소드 뒤에는 항상 onStart()가 호출된다.

MainActivity에서 DetailActivity로 이동했다가 다시 MainActivity로 돌아왔을 때의 메소드 호출순서는 다음과 같다.

=== Start DetailActivity ===
Main: onPause()
Detail: onCreate()
Detail: onStart()
Detail: onResume()
Main: onStop()
=== return to MainActivity ===
Detail: onPause()
Main: onRestart()
Main: onStart()
Main: onResume()
Detail: onStop()
Detail: onDestroy()

여기서 주목할 점은 onStop()은 다음에 띄워질 Activity가 onResumse() 호출하고 나서 호출된다는 걸 기억해야한다.

마치며

여기까지가 Activity가 가지고 있는 Lifecycle 콜백 메소드와 각 메소드가 어떻게 동작하는지 개발자는 어떻게 처리해주면 좋을 지 알아봤다.
다음은 Fragment의 Lifecycle를 정리해보려고 한다.

profile
축구왕이 되고 싶은 안드로이드 개발자

0개의 댓글