IT/Android

[Android] 생명주기 메서드의 종류

jaewon_sss 2024. 1. 26. 21:18
반응형

onCreate()

액티비티를 생성할 때 바로 실행되므로 필수적으로 구현해야 한다. 즉, 액티비티가 생성되면 상태는 (onCreate) 상태.

액티비티의 전체 생명주기 동안 한 번만 발생
예를 들어 onCreate() 구현하면 목록에 데이터를 Binding, 액티비티를 ViewModel 과 연결, 일부 클래스의 변수를 인스턴스화 할 수 있다. 이 메서드는 savedInstaceState 라는 parameter를 수신하는데 이는 액티비티의 이전 저장 상태가 포함된 Bundle 객체이다.

처음 생성된 액티비티라면 이 값은 null이겠지?

XML파일을 정의하고 setContentView()에 전달하여 화면에 표시할 수 있다.

ex) binding = DataBindingUtil.setContentView(this, R.layout.activity)


혹은 액티비티 코드에서 새 View 객체를 생성하고, 그 View를 ViewGroup에 넣어서 뷰 계층 구조를 만들 수 있다. 

그 후 ViewGroup을 setContentView()에 전달해서 그 레이아웃을 사용한다.

onCreate() 상태에 머무르지 않고 바로 onStart()와 onResume() 메소드를 실행시킨다.

 

 

 

 

onStart()

액티비티가 Start 상태 -> onStart() 호출. 액티비티가 사용자에게 표시되고 앱의 액티비티를 Foreground에 보내 상호작용하게 함.

액티비티는 Start 상태에 머무리지 않고 이 콜백이 완료되면 액티비티가 onResume() 메서드 호출, RESUMED 상태에 들어간다.

 

 

 

 

onResume()

액티비티가 RESUME 상태에 들어가면 포그라운드에 표시되고 onResume() 콜백 호출. 이 상태에서 앱은 사용자와 상호작용한다.

특정 이벤트 발생(전화가 오거나, 사용자가 다른 액티비티로 이동, 기기 화면이 꺼짐 등) 전까지 앱은 이 상태에 머문다.
개발자는 이 상태에서 생명주기 component가 포그라운드에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화할 수 있다. 

특정 이벤트 발생 -> Pasued 상태 -> onPause() 콜백 호출 -> 다시 Resumed 상태로 돌아오면 -> 다시 onResume() 콜백 호출.


따라서 onResume()을 구현하여 onPause() 일 때 해제하는 구성요소를 초기화하고

액티비티가 Resumed 상태로 전환될 때 마다 필요한 다른 초기화 작업도 수행해야 한다.

 

 

 

 

onPause()

  • 시스템은 사용자가 액티비티를 떠날 때의 첫번째 신호로 이 메서드를 호출한다. (항상 Destroyed는 아님)
  • 액티비티가 포그라운드에 없다는 것을 의미한다.(멀티 윈도우 모드 제외)
  • onPause() 메서드를 사용하여 액티비티가 Paused 상태일 때 실행을 멈추고 잠시 후 다시 시작할 작업을 일시중지하거나 조정한다.

 

액티비티가 Paused 상태에 들어가는 이유

  • 일부 이벤트가 앱 실행을 방해하기 때문 (가장 일반적)
  • 멀티 윈도우 모드에서 보이는 여러 앱 중 포커스를 가진 앱 제외하고 모두 Paused 됨
  • Dialog 같은 새로운 반투명 액티비티가 열림. (기존 액티비티가 부분적으로 보이지만 포커스 상태 아니면 Paused)

구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지할 수 있다.

또한 배터리나 데이터를 많이 잡아먹는 기능 혹은 액티비티가 Paused 상태이고 사용자가 필요로 하지 않을 때의 모든 리소스를 onPause() 메서드를 사용해 해제할 수 있다. 그런데 멀티윈도우 모드일 때는 Paused 상태여도 화면에 보일 수 있으므로 onStop() 상태일 때 해제하는 것이 바람직하다.

onPause() 는 아주 잠깐 실행되므로 데이터 저장, 네트워크 호출, 데이터베이스 처리를 실행하면 안된다.

부하가 큰 종료 작업은 onStop() 상태일 때 실행되야 한다.

onPause() 메서드의 실행이 완료되더라도 액티비티가 Paused 상태로 남을 수 있다. 오히려 액티비티는 다시 시작되거나 완전히 보이지 않게 될 때까지 이 상태에 머문다.


이 때는 최상위 상태가 Resumed 상태인 콜백 메서드 중에 생성된 component는 다시 초기화할 필요가 없다. 액티비티가 완전히 보이지 않게 되면 onStop() 호출한다.

 

 

 

 

onStop()

액티비티가 사용자에게 더이상 표시되지 않으면 Stop 상태

onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 불필요한 리소스를 해제하거나 조정해야 한다.

onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 액티비티가 보여도 UI 관련 작업이 계속 진행됨.

또한, onStop()을 사용할 때, CPU를 많이 사용하는 작업을 종료해야 한다.(ex. DB 저장)

액티비티가 Stop 상태에 들어가면 Activity 객체는 메모리 안에 머문다.

이 객체가 모든 상태 및 멤버 정보를 관리하지만 창 관리자와 연결되어 있지 않다. 액티비티가 다시 시작되면 이 정보를 다시 호출한다. 

최상위 상태가 Resumed 상태인 콜백 메서드 일 때 생성된 구성요소는 다시 초기화할 필요는 없다. 

또 시스템은 레이아웃에 있는 각 View 객체의 현재 상태도 기록한다.

따라서 사용자가 EditText 위젯에 텍스트를 입력하면 해당 내용이 저장되기 때문에 이를 따로 저장하거나 복원할 필요없다.

액티비티가 다시 시작되면 onRestart() 호출, 액티비티가 실행을 종료하면 onDestroy() 호출.

 

 

 

 

onDestroy()

onDestroy()는 액티비티가 소멸되기 전에 호출된다.

  • 사용자가 액티비티를 완전히 닫거나 finish()가 호출되어 액티비티 종료될 때
  • 이 때 생명주기 구성요소는 액티비티 destroy 전에 필요한 것들을 정리할 수 있다.

액티비티가 Destroy 후 Restart하면 ViewModel은 그대로 보존되어, 다음 액티비티에 전달돼서 추가 작업이 불필요하다.

하지만 액티비티가 Restart하지 않으면 ViewModel은 onCleared() 메서드를 호출하여 액티비티 Destroy 전에 모든 데이터를 정리해야 한다.

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

 

 

 

 

 

끗 ! 

반응형