ANDROID/Android 앱 프로그래밍

[Android] 액티비티의 생명주기(Life cycle)

주 녕 2021. 5. 25. 20:38
반응형

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 

 

액티비티의 생명주기(Life Cycle)

액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해서 실행, 중지, 메모리에서 해제되는 여러 과정의 상태 정보를 갖고 있음. 이런 상태 정보는 시스템이 관리하면서 각각의 상태에 해당하는 메서드를 자동으로 호출함.

 

액티비티의 상태 정보

  • 실행(Running)
    • 화면상에 액티비티가 보이면서 실행되어 있는 상태
    • 액티비티 스택의 최상위에 있으며 포커스를 가지고 있음
  • 일시 정지(Pause)
    • 사용자에게 보이지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태
    • 대화 상자가 위에 있어 일부가 가려진 경우에 해당
  • 중지(Stopped)
    • 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태

 

액티비티의 상태 메서드

시스템에서 액티비티의 생성부터 실행까지 자동으로 호출하는 메서드 → 콜백 메서드(Callback Method)

액티비티의 생명주기

상태 메서드 설 명
onCreate()
  • 액티비티가 처음 만들어졌을 때 호출됨
  • 화면에 보이는 View들의 일반적인 상태를 설정하는 부분
  • 이전 상태가 저장되어 있는 경우에는 번들(Bundle) 객체를 참조하여 이전 상태 복원 가능
  • 이 메서드 다음에는 항상 onStart()가 호출됨
onStart()
  • 액티비티가 화면에 보이기 바로 전에 호출됨
  • 액티비티가 화면 상에 보이면 이 메서드 다음에 onResume() 메서드가 호출됨
  • 액티비티가 화면에서 가려지게 되면 이 메서드 다음에 onStop() 메서드가 호출됨
onResume()
  • 액티비티가 사용자와 상호작용하기 바로 전에 호출됨
onRestart()
  • 액티비티가 중지된 이후에 호출되는 메서드로 다시 시작되기 바로 전에 호출됨
  • 이 메서드 다음에는 항상 onStart() 메서드가 호출됨
onPause()
  • 또 다른 액티비티를 시작하려고 할 때 호출됨
  • 저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메서드
  • 이 메서드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행된 후 리턴되어야 함
  • 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음
onStop()
  • 액티비티가 사용자에게 더 이상 보이지 않을 때 호출됨
  • 액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출됨
  • 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음
onDestory()
  • 액티비티가 소멸되기 없어지기 전에 호출됨
  • 이 메서드는 액티비티가 받는 마지막 호출이 됨
  • 액티비티가 앱에 의해 종료되거나(finish() 메서드 호출) 시스템이 강제로 종료시키는 경우에 호출될 수 있음
  • 위의 두 가지 경우를 구분할 때 isFinishing() 메서드를 이용함
  • 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음

 

☝ 실제 앱을 구성할 때는 중간에 전화가 오거나 갑자기 핸드폰이 종료된 이후에도 게임 진행중이던 상태로 다시 돌아가야 함

💡 이련 경우, onPause()와 onResume() 메서드를 사용해야 함. 앱이 멈추거나 없어질 때, 앱이 다시 보이거나 새로 실행될 때 호출되어 이 2가지 메서드를 구현하여 앱의 상태를 저장하거나 복원해야 함!

onPause()에서 데이터를 저장하고, onResume() 안에서 데이터 복원

💡 액티비티를 중지시키기 전에 호출되는 onSaveInstanceState() 메서드를 이용해 데이터를 임시 저장할 수 있음. 

→ onSaveInstanceState() 메서드의 파라미터로 전달되는 번들 객체를 이용해 데이터를 저장하면 onCreate()나 onRestoreInstanceState() 메서드로 저장했던 데이터가 전달됨

 

 

[예제]

onStart, onStop, onResume, onPause, onDestroy 메서드를 불러와 로그와 Toast 메세지를 입력!

마우스 우클릭 → [Generate → Override Methods...] 에서 Ctrl 누른 채로 원하는 메소드들 선택

 

onCreate → onStart → onResume → onPause → onStop → onDestroy

  • 화면이 보일 때 : onCreate → onStart → onResume
  • 시스템 [Back] 버튼을 눌렀을 때 (화면전환) : onPause → onStop 
    • 화면 전환 시에는 onDestory() 메서드가 호출되지 않음 → 새롭게 올라오는 화면 뒤에 숨어 있는 것과 같은 상태
    • 실제로는 액티비티 스택으로 들어가는 것임
    • 위에 있던 액티비티가 사라지면 다시 onResume()이 호출되면서 화면에 보임

  • 시스템 [Back] 버튼을 눌렀을 때 (강제종료) : onPause → onStop → onDestroy
반응형