본문 바로가기
Study/Android

Android 액티비티 생명주기 lifecycle 관리

by USAGI_ 2023. 1. 31.
액티비티 생명주기 관리

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko 

 

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

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

developer.android.com

 

사용자가 액티비티를 벗어났다가 다시 돌아왔을 때 활동이 작동하는 방식을 lifecycle 콜백 메서드에서 선언할 수 있다.

예를 들어, 스트리밍 동영상 플레이어를 빌드할 때, 사용자가 다른 앱으로 전환한다면 아래와 같이 흐름을 나타낼 수 있다.

 

사용자가 다른 앱으로 전환, 동영상을 일시중지하고 네트워크 연결을 종료한다 → 그 후, 사용자가 돌아온다면 네트워크를 다시 연결하고 사용자가 일시중지한 지점에서 동영상을 다시 시작하도록 허용한다.

즉, 각 콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다. 적시에 알맞은 작업을 하고 적절하게 전환을 처리하면 앱이 더욱 안정적으로 기능할 수 있다. 

예를 들어 lifecycle 콜백을 잘 구현하면 앱에서 당므과 같은 문제가 발생하지 않도록 예방하는 데 도움이 될 수 있다.

 

- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제

- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제

- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제 

- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제

 

먼저 생명주기 패러다임에 대해 이해해보자. 

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

 

생명주기 콜백 

onCreate()

시스템이 먼저 활동을 생성할 때 실행되는 것으로 필수적으로 구현해야 한다. 

onCreate() 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행한다.

예를 들어 onCreate()를 구현하면 데이터를 목록에 바인딩하고, 활동을 ViewModel과 연결하고, 일부 클래스 범위 변수를 인스턴스화 할 수도 있다. 

이 메서드는 savedInstanceState 매개변수를 수신하는데, 이는 활동의 이전 저장 상태가 포함된 Bundle 객체이다. 

이번에 처음 생성된 활동인 경우 Bundle 객체의 값은 null이 된다. 

 

예시 ) 사용자 인터페이스 선언(xml 레이아웃 파일에 정의), 멤버 변수 정의, 일부 UI 구성 등의 활동에 관한 기본 설정

xml 레이아웃 파일은 파일의 리소스 ID인 R.layout.main_activity를 setContentView()에 전달하여 지정한다.

 

onCreate() 메서드가 실행을 완료하면 onStart() 상태가 되고, 연달아 onResume() 메서드를 호출한다.

 

onStart() 

액티비티가 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비한다.

예를 들어 onStart()가 호출되면 이 메서드에서 앱이 UI를 관리하는 코드를 초기화하는 작업을 한다.

onStart()는 매우 빠르게 완료되고 Create와 마찬가지로 활동은 Start 상태에 머무르지 않는다. 이 콜백이 완료되면 활동이 재개됨 상태에 들어가고, 시스템이 onResume() 메서드를 호출한다.

 

onResume()

활동이 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 onResume() 콜백을 호출한다. 

이 상태에 들어갔을 때 앱이 사용자와 상호작용을 하며, 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무른다.

예를 들어 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트가 이에 해당한다.

활동이 재개됨 상태로 전환되면 이 활동의 생명 주기와 연결된 모든 생명주기 인식 구성요소는 ON_RESUME 이벤트를 수신한다. 이 상태에서 생명주기 구성요소가 포그라운드에서 사용자에게 보이는 동안 실행해야하는 모든 기능을 활성화할 수 있다. (예시 : 카메라 미리보기 시작)

 

방해되는 이벤트가 발생하면 활동은 일시중지 상태로 들어가고, 시스템이 onPause() 콜백을 호출한다.

활동이 일시중지 상태에서 재개됨 상태로 돌아오면 시스템이 onResume() 메서드를 다시 한 번 호출한다.

따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전활될 때마다 필요한 다른 초기화 작업도 수행해야 한다.

 

 

onPause() 

사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출한다. 활동 포그라운드에 있지 않게 되었다는 것을 타내며 onPause() 메서드를 사용하여 Activity가 일시중지 상태일 때 계속 실행(또는 적절히 계속 실행)되어서는 안되지만 잠시 후 다시 시작할 작업을 일시중지하거나 조정할 수 있다.

액티비티가 이 상태에 들어가는 이유는 여러가지가 있다.

 

예시) 일부 이벤트가 앱 실행을 방해하는 것이 일반적인 사례, 여러 앱이 멀티 윈도우 모드에서 실행되며 언제든지 그 중 하나의 앱만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지한다.

새로운 반투명 활동(메세지, 통화 등)이 열리며 활동이 부분적으로 보이지만 포커스 상태가 아닌 경우에는 일시중지 상태로 유지

 

액티비티가 일시중지 상태로 전환하면 이 액티비티의 생명주기와 연결된 모든 수명 주기 인식 구성요소는 ON_PAUSE 이벤트를 수신한다. 여기에서 생명주기 구성요소는 구성요소가 포그라운드에 있지않을 때, 실행할 필요가 없는 기능을 모두 정지할 수 있다. (예: 카메라 미리보기 정지) 

 

또한, onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들(ex.GPS) 또는 활동이 일시정지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수 있다.

 

멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause()대신 onStop()을 사용한다. 

 

onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기엔 시간이 부족할 수 있기 때문에, 

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

onPause는 빠르게 실행이 완료되기 때문에 메서드 실행이 끝나기 전에 작업이 완료되지 못할 수 있다.

onPause()메서드의 실행이 완료되더라도 활동이 일시중지 상태로 남아있을 수 있으며 오히려 활동은 다시 시작되거나 사용자에게 완전히 보이지 않게 될 때까지 이 상태에 머무른다.

 

onStop() 

액티비티가 사용자에게 더 이상 표시되지 않으면 중단상태에 들어가고, 시스템은 onStop() 콜백을 호출한다.

이는 예시로, 새롭게 시작된 활동이 화면 전체를 차지할 경우 적용된다. 시스템은 활동의 실행이 완료되어 종료될 시점에 onStop()호출할 수도 있다.

활동이 중단상태에 들어가면 Activity 객체는 메모리 안에 머무르게 되며, 이 객체가 모든 상태 및 멤버 정보를 관리하지만 창 관리자와는 연결이 되어있진 않다.

활동이 다시 시작되면 이 정보를 다시 호출하고, 최상위 상태가 재개 상태인 콜백 메서드 중에 생성된 구성 요소는 다시 초기화할 필요가 없다.

또한 시스템은 레이아웃에 있는 각 View 객체의 현재 상태도 기록하며, 사용자가 EditText 위젯에 텍스트를 입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 필요가 없다.

활동은 정지 상태에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라진다.

활동을 다시 시작하면 시스템은 onRestart를 호출하며, Activity가 실행을 종료하면 시스템은 onDestory를 호출한다.

 

 

onDestroy()

활동이 소멸되기 전에 호출, 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출한다.

1. (사용자가 활동을 완전히 닫거나 활동에서 finish()가 호출되어) 활동이 종료되는 경우

2. 구성 변경(기기회전 또는 멀티 윈도우 모드)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우

 

활동에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel 객체를 이용하여 활동의 관련 뷰 데이터를 포함해야 한다. 활동이 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 활동 인스턴스에 전달되므로 추가 작업이 필요하지 않는다. 

활동이 다시 생성되지 않을 경우 ViewModel은 onCleared() 메서드를 호출하여 활동이 소멸되기 전에 모든 데이터를 정리해야한다.

 

onDestroy() 콜백은 이전의 콜백에서 아직 해제되지 않은 모든 리소스(onStop())를 해제해야 한다. 

 

Activity 실행
멀티 윈도우 버튼 클릭
세로모드 -> 가로모드 변환시 콜백함수 로그