[Android] Activity Lifecycle

leeeha·2023년 4월 7일
0

안드로이드

목록 보기
2/6
post-thumbnail

The activity lifecycle

사용자가 앱을 탐색하고, 앱을 나갔다가 다시 돌아올 때 앱의 액티비티 인스턴스는 수명 주기 내에서 다양한 상태로 전환합니다. Activity 클래스는 상태가 변경되거나 시스템이 액티비티를 생성, 중지, 재개 및 액티비티가 상주하는 프로세스를 파괴할 때 이를 액티비티에게 알리는 여러 콜백을 제공합니다.

수명 주기 콜백 메서드 내에서 사용자가 액티비티를 나갔다가 다시 들어올 때, 액티비티가 어떻게 행동해야 하는지 선언할 수 있습니다. 예를 들어 스트리밍 비디오 플레이어를 구축하는 경우, 사용자가 다른 앱으로 전환하면 비디오를 일시 중지하고 네트워크 연결을 종료할 수 있습니다. 사용자가 다시 돌아오면 네트워크에 다시 연결하여 사용자가 동일 시점에서 비디오를 다시 시작하도록 할 수 있습니다.

각 콜백을 통해 주어진 상태 변화에 적합한 특정 작업을 수행할 수 있습니다. 적시에 적절한 작업을 수행하고 전환을 적절히 처리하면 앱의 견고성과 성능이 향상됩니다. 예를 들어, 수명 주기 콜백을 잘 구현하면 앱에서 다음과 같은 문제를 방지할 수 있습니다.

  • 사용자가 앱 사용 중에 전화를 받거나 다른 앱으로 전환하는 경우 충돌이 발생합니다.
  • 사용자가 앱을 활동적으로 사용하지 않을 때 귀중한 시스템 리소스를 소비합니다.
  • 사용자가 앱을 떠났다가 나중에 다시 돌아올 경우 사용자의 진행 상황이 손실됩니다.
  • 화면이 가로와 세로 방향 사이에서 회전할 때 충돌이 발생하거나 사용자의 진행 상황이 손실됩니다.

Activity-lifecycle concepts

액티비티 수명 주기의 각 단계 간 전환을 위해 Activity 클래스는 6개의 핵심 콜백 메서드인 onCreate(), onStart(), onResume(), onPause(), onStop() 및 onDestroy()를 제공합니다. 액티비티가 새로운 상태에 진입하면, 시스템은 이러한 콜백을 각각 호출합니다.

아래 그림은 이 패러다임을 시각적으로 표현한 것입니다.

사용자가 액티비티를 종료하기 시작하면, 시스템에서 메서드를 호출하여 액티비티를 해제합니다. 사용자가 다른 앱으로 전환하는 것처럼 액티비티가 부분적으로만 해제되고, 여전히 메모리에 남아 있는 경우도 있습니다. 이러한 경우에는 액티비티가 여전히 포그라운드로 돌아올 수 있습니다.

사용자가 액티비티로 돌아오면 사용자가 중단한 지점부터 액티비티가 다시 시작됩니다. 몇 가지 예외를 제외하고 앱은 백그라운드에서 실행 중일 때 액티비티를 시작하지 못하도록 제한됩니다.

시스템에서 특정 프로세스와 그 안에 있는 액티비티를 종료할 가능성은 당시의 액티비티 상태에 따라 달라집니다.

액티비티의 복잡성에 따라 모든 수명 주기 메서드를 구현할 필요가 없을 수도 있습니다. 그러나 각각을 이해하고 앱이 사용자가 기대하는 방식으로 작동하도록 구현하는 것이 중요합니다.

Lifecycle callbacks

onCreate()

시스템에서 액티비티를 생성할 때 실행되는 이 콜백은 필수적으로 구현해야 합니다. 그 내부 구현에서 액티비티의 필수 구성 요소를 초기화 해야 합니다. 예를 들어 앱은 이 콜백에서 뷰를 생성하고 데이터를 목록에 바인딩 할 수 있습니다. 가장 중요한 것은 이 시점에서 setContentView()를 호출하여 액티비티의 UI를 위한 레이아웃을 정의해야 한다는 점입니다.

onCreate()가 완료되면 다음 콜백은 항상 onStart()입니다.

onStart()

onCreate()가 종료되면 액티비티가 Started 상태가 되면서 사용자는 액티비티 화면을 볼 수 있습니다. 이 콜백에는 액티비티가 포그라운드로 나와 사용자와 상호 작용하기 위한 최종 준비가 포함되어 있습니다.

onResume()

시스템은 액티비티가 사용자와 상호 작용을 시작하기 직전에 이 콜백을 호출합니다. 이 시점에서 액티비티는 액티비티 스택의 최상단에 있으며 모든 사용자의 입력을 감지합니다. 앱의 핵심 기능 대부분은 onResume() 메서드에서 구현됩니다.

onPause() 콜백은 항상 onResume() 뒤에 호출됩니다.

onPause()

액티비티가 포커스를 잃고 일시 중지 상태가 되면 시스템에서 onPause()를 호출합니다. 이 상태는 예를 들어 사용자가 뒤로 또는 최근 항목 버튼을 탭할 때 발생합니다. 시스템에서 액티비티에 대해 onPause()를 호출하는 것은 엄밀히 말하면, 액티비티가 여전히 부분적으로 표시되고 있지만, 대부분의 경우 사용자가 액티비티를 떠나고 있으며 액티비티가 곧 중지 또는 재개 상태가 될 것임을 의미합니다.

일시 중지된 상태의 액티비티는 사용자가 UI 업데이트를 기대하는 경우 UI를 계속 업데이트할 수 있습니다. 이러한 예로는 내비게이션 지도 또는 미디어 플레이어 재생을 보여주는 화면이 있습니다. 이러한 액티비티에서는 포커스가 사라지더라도 사용자는 UI가 계속 업데이트 될 것으로 기대합니다.

애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행할 때 onPause()를 사용해서는 안 됩니다.

onPause() 실행이 완료되면 이후 상황에 따라 onStop() 또는 onResume() 중 하나가 호출됩니다.

onStop()

액티비티가 더 이상 사용자에게 표시되지 않을 때 시스템은 onStop()을 호출합니다. 보통 액티비티가 파괴되거나, 새 액티비티가 시작되거나, 기존 액티비티가 Resumed 상태로 전환되는 경우, 원래 액티비티는 사용자에게 더 이상 표시되지 않습니다.

액티비티가 사용자와 상호 작용하기 위해 다시 돌아오는 경우 시스템은 onRestart()를 호출하지만, 액티비티가 완전히 종료되는 경우에는 onDestroy()를 호출합니다.

onDestroy()

시스템은 액티비티가 소멸되기 직전에 이 콜백을 호출합니다. 이 콜백은 액티비티가 수신하는 마지막 콜백입니다. 일반적으로 액티비티 또는 액티비티가 포함된 프로세스가 소멸될 때, 액티비티의 모든 리소스를 해제하기 위해 onDestroy() 메서드를 구현합니다.

생명주기 관련 Quiz

📌 문제 출처: 2025 안드로이드 탐구 영역 15번 문제

Q. onDestroy() 생명주기 콜백 함수에 대해 틀린 설명을 모두 고르시오.

  1. Activity 생명주기 콜백 함수 중 가장 마지막에 호출되는 함수이다.
  2. 하나의 액티비티 객체에서 단 한번만 호출된다.
  3. 이 콜백 함수가 호출되기 이전에 onStop() 콜백 함수가 무조건 한번 호출된다. (X)
  4. 액티비티 객체가 가비지 컬렉터에 의해 수거되기 직전에 호출되는 함수이다. (X)
  5. 액티비티가 백그라운드에 있을 때 System Kill 당하는 경우 이 콜백 함수는 호출되지 않는다.

정답: 3번, 4번

  • 3번: onCreate()에서 finish() 호출 시, onStop() 없이 onDestroy()가 바로 호출될 수 있다.
  • 4번: onDestroy()는 액티비티가 소멸되기 직전에 호출되는 함수이다. 가비지 컬렉션은 더 이상 참조되지 않는 객체를 시스템이 필요에 따라 수거하는 동작으로, onDestroy() 함수가 이러한 시스템의 동작을 보장하지는 않는다.

📌 문제 출처: 지원자 95%가 틀리는 startActivity()라이프사이클, 당신도 예외는 아닙니다

Q. Main Activity에서 Detail Activity를 호출했을 때
생명주기 콜백 메서드가 호출되는 순서를 나열해보세요.

[Main] onPause() → Main Activity에 대한 포커스를 잃는다. (이후에는 onStop or onResume)
[Detail] onCreate()
[Detail] onStart()
[Detail] onResume()
[Main] onStop() → Main Activity가 더 이상 사용자에게 보이지 않는다.

Q. Detail Activity 종료후 다시 Main Activity가 보여질 때
생명주기 콜백 메서드가 호출되는 순서를 나열해보세요.

[Detail] onPause()
[Main] onRestart()
[Main] onStart()
[Main] onResume()
[Detail] onStop()
[Detail] onDestroy()

참고 자료

profile
습관이 될 때까지 📝

0개의 댓글