Mobile Develop/Android

[Android] Activity Lifecycle (액티비티 생명주기)

nyangzzi 2024. 1. 13. 18:15
반응형

 

안드로이드 시스템은 실행되는 앱의 상태를 직접 관리한다.

멀티 태스킹 및 외부 인터럽트에 민감한 모바일 플랫폼의 특성상 사용자 앱이 시스템에 의해 관리되지 않으면, 특정 앱이 과도하게 메모리를 점유하여 다른 앱의 원활한 실행을 막는 등 여러 문제를 야기할 수 있기 때문이다.

 

따라서 안드로이드는 이런 문제를 방지하기 위해 액티비티의 상태 정보가 변화하는 것을 관리하며, 개발자는 Activity 클래스를 통해 상태 변화에 관한 콜백을 받음으로써 여러 액션을 쉽게 관리할 수 있게 된다.

 

 

 

액티비티의 생명주기는 onCreate(), onStart(), onResume, onPause(), onStop(), onDestory(), onRestart()의 7가지 상태로 이뤄져 있으며, 각각의 상태는 다음과 같은 의미를 가진다.

 

onCreate()

말 그대로 액티비티가 '탄생'하는 상태이다. 따라서 가장 먼저 호출되며, 생명주기 안에서 단 한 번 발생한다.

데이터를 목록에 바인딩하고, activiy를 viewModel과 연결하는 등 화면에 보이는 뷰들의 일반적인 상태를 설정한다. 

또한 savedInstanceState 매개변수를 수신하는데, 이는 활동의 이전 저장 상태가 포함된 Bundle 객체이므로 이전 상태가 저장되어 있는 경우 상태의 복원이 가능하다. (처음 생성된 활동인 경우 Bundle 객체의 값은 null)

 

설정이 모두 완료되면 액티비티는 자동으로 다음 onStart() 상태로 넘어가게 된다.

 

onStart()

액티비티가 '시작'하는 상태이므로, UI를 관리하는 코드를 초기화 하는 등 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비한다. create에서 만들어진 액티비티가 사용자에게 보이도록 표시하는 부분이라고 생각할 수 있다.

 

onResume()

생성된 액티비티가 보이는 것을 넘어 사용자와 상호작용 할 수 있는 상태에 도달했을 때를 의미한다.

전화가 걸려오거나, 기기 화면이 꺼지는 등 어떤 방해 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 이 상태에 머무르게 된다.

 

onPause()

onResume() 상태에서 특정 방해 이벤트가 발생하여 액티비티에 포커스가 떠난다면 onPause(), 일시정지 상태로 변하게 된다. 반대로 onPause() 상태에서 액티티비로 다시 돌아오게 되면 onResume()으로 다시 돌아간다.

(화면은 계속 사용자에게 보이는 경우 / 완전히 가려지면 onStop()상태)

 

이때 사용자가 액티비티와 상호작용을 하지 않고 있을 때에도 인텐트를 계속 수신하는 등 활동이 지속된다면 불필요한 시스템 오버헤드가 발생하게 되므로, onPause()에서 해제해주는 것이 좋다.

 

(브로드캐스트 리시버 등록/해제 예시)

더보기

예를 들어 브로드캐스트 리시버를 onResume에서 등록하고, onPause()에서 해제하면 리시버가 중복 생성되는 것을 방지하며 사용자가 액티비티와 상호작용하는 동안에만 intent를 수신할 수 있게 된다.

(onSaveInstanceState에서 등록을 취소할 경우, 호출되지 않을 가능성이 있으므로 onPause에서 해주는 것이 좋다)

https://developer.android.com/guide/components/broadcasts

To stop receiving broadcasts, call unregisterReceiver(android.content.BroadcastReceiver). Be sure to unregister the receiver when you no longer need it or the context is no longer valid. Be mindful of where you register and unregister the receiver, for example, if you register a receiver in onCreate(Bundle) using the activity's context, you should unregister it in onDestroy() to prevent leaking the receiver out of the activity context. If you register a receiver in onResume(), you should unregister it in onPause() to prevent registering it multiple times (If you don't want to receive broadcasts when paused, and this can cut down on unnecessary system overhead). Do not unregister in onSaveInstanceState(Bundle), because this isn't called if the user moves back in the history stack.

override fun onResume() { 
     super.onResume(); 
     registerReceiver(mReciever, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
} 

override fun onPause() { 
    super.onPause(); 
    unregisterReceiver(mReceiver)
 }

 

이때, 일시정지 메서드가 리턴되기 전까지 다음 액티비티가 호출되지 못하므로 무한루프에 빠지거나 처리에 오래 걸리는 활동을 수행하지 않도록 주의해야한다.

 

onStop()

액티비티가 또 다른 액티비티에 가려지는 등 사용자에게 더 이상 보이지 않을 때 호출된다.

화면이 더 이상 표시되지 않고 있으므로 화면에 관련한 리소스까지 해제하거나 조정되지만, 활동이 완전히 종료된 것은 아니므로 Activity 객체는 메모리에 계속 남아있다. 즉, 모든 상태와 멤버 정보를 유지하지만 창 관리자에는 연결되지 않다가, 활동이 재개되면 이 정보가 다시 호출된다.

 

onRestart()

onStop() 상태에서 화면이 다시 표시되면 onRestart() 상태가 된다.

액티비티가 재시작됨을 알리고 나면, onStart()가 실행되어 화면을 다시 구성한다.

 

onDestory()

액티비티가 완전히 소멸되어 이전 상태 (onStop())에서 해제 되지 않은 모든 리소스가 해제된다.

1. 시스템이 다른 활동을 위한 메모리를 확보하기 위해 강제로 종료시키거나, 2. finish() 메서드 호출 등 앱에 의해 종료될 때 호출된다.

 

isFinishing() 메서드를 통해 어떻게 액티비티가 종료되었는지 구분할 수 있으며, finish()가 호출된 경우 true이다.

Activity가 다시 생성되지 않을 경우 연결된 ViewModel에서도 onCleared()가 호출되어 모든 데이터를 정리할 수 있다. 혹은 구성변경으로 인해 Activity가 다시 생성되는 경우에는 ViewModel이 보존되어 다음 Activity 인스턴스에 제공된다.

 

아래는 시스템에 의해 액티비티가 강제로 종료될 수 있는 상황을 나타내고 있으며,

onPause(), onStop(), onDestory()에서 시스템이 액티비티를 강제 종료할 확률이 특히 높다.

 


상황에 따른 상태 변화

 

액티비티 시작

onCreate() -> onStart() -> onResume()

 

화면 회전

onPause() -> onStop() -> onDestroy() -> onCreate() 

 

다른 액티비티에 가려짐 / 화면 OFF(전원키) / 홈으로 이동(홈키)

onPause() -> onStop()

 

백키로 액티비티 종료

onPause() -> onStop() -> onDestroy()

 

이전 액티비티로 돌아옴 / 홈키로 나갔다가 돌아올 때

onRestart() -> onStart() -> onResume()

 

다이얼로그나 투명 액티비티가 위에 뜰 때

onPause()


참고

 

활동 수명 주기에 관한 이해  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com

 

반응형