개발일지

Android in A..Z - Activity Lifecycle 본문

Android (안드로이드)

Android in A..Z - Activity Lifecycle

강태종 2020. 7. 28. 13:06

 

onCreate

이 콜백은 시스템이 먼저 활동을 생성할 때 실행되는 것으로, 필수적으로 구현해야 합니다. 활동이 생성되면 생성됨 상태가 됩니다. onCreate() 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행합니다. 예를 들어 onCreate()를 구현하면 데이터를 목록에 바인딩하고, 활동을 ViewModel과 연결하고, 일부 클래스 범위 변수를 인스턴스화할 수도 있습니다. 이 메서드는 savedInstanceState 매개변수를 수신하는데, 이는 활동의 이전 저장 상태가 포함된 Bundle 객체입니다. 이번에 처음 생성된 활동인 경우 Bundle 객체의 값은 null입니다.

  • Activity가 생성될 때 실행된다.
  • Lifecycle에서 한번밖에 실행되지 않는다.
  • 초기화 작업을 주로한다.
  • saveInstanceState: Bundle은 이전의 상태를 저장한 객체이다.

onStart

활동이 시작됨 상태에 들어가면 시스템은 이 콜백을 호출합니다. onStart()가 호출되면 활동이 사용자에게 표시되고, 앱은 활동을 포그라운드에 보내 상호작용할 수 있도록 준비합니다. 예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화합니다.

 

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

  • 액티비티가 사용자에게 보여지기 바로 직전에 호출됨
  • UI관련 코드를 처리하기 좋다.

onResume

활동이 재개됨 상태에 들어가면 포그라운드에 표시되고 시스템이 onResume() 콜백을 호출합니다. 이 상태에 들어갔을 때 앱이 사용자와 상호작용합니다. 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱이 이 상태에 머무릅니다. 예를 들어 전화가 오거나, 사용자가 다른 활동으로 이동하거나, 기기 화면이 꺼지는 이벤트가 이에 해당합니다.

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

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

활동이 일시중지됨 상태에서 재개됨 상태로 돌아오면 시스템이 onResume() 메서드를 다시 한번 호출합니다. 따라서 onResume()을 구현하여 onPause() 중에 해제하는 구성요소를 초기화하고, 활동이 재개됨 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 합니다.

 

  • 사용자와 상호작용하기 직전에 호출됨.
  • 초기화를 진행하는 코드를 넣는다. (onCreate는 Acitivity가 생성될 때 한번만 실행되기 때문에 그에 맞는 코드를 넣고 onResume은 Pause 상테에서 돌아올 때마다 실행되기 때문에 그에 맞는 코드를 넣는다.)

onPause

시스템은 사용자가 활동을 떠나는 것을 나타내는 첫 번째 신호로 이 메서드를 호출합니다(하지만 해당 활동이 항상 소멸되는 것은 아님). 활동이 포그라운드에 있지 않게 되었다는 것을 나타냅니다(다만 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 표시 될 수도 있음). onPause() 메서드를 사용하여 Activity가 일시중지됨 상태일 때 계속 실행(또는 적절히 계속 실행)되어서는 안 되지만 잠시 후 다시 시작할 작업을 일시중지하거나 조정합니다.

 

또한 onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들(예: GPS) 또는 활동이 일시중지 중이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제할 수도 있습니다. 그러나 앞서 onResume() 섹션에서 언급했듯이 일시중지된 활동은 멀티 윈도우 모드에서 여전히 완전히 보이는 상태일 수 있습니다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋습니다.

  • Acitivity의 일부분이 가려질 때 호출된다.
  • 에니메이션 등 화면 갱신 처리를 정지, 데이터 저장 관련 코드를 작성한다.
  • onPause가 끝나기 전에 다른 화면으로 전환되지 않으므로 실행 시간이 긴 코드를 작성하지 않는다.

onStop

활동이 사용자에게 더 이상 표시되지 않으면 중단됨 상태에 들어가고, 시스템은 onStop() 콜백을 호출합니다. 이는 예를 들어 새로 시작된 활동이 화면 전체를 차지할 경우에 적용됩니다. 시스템은 활동의 실행이 완료되어 종료될 시점에 onStop()을 호출할 수도 있습니다.


또한 onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 합니다. 예를 들어 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장할 수 있습니다. 다음 예시는 초안 내용을 영구 저장소에 저장하는 onStop()을 구현한 것입니다.

  • Activity가 전부 가려질 때 호출된다.
  • onPause와 비슷한 작업을 한다. 하지만 onPause는 끝나기 전에 다른 화면으로 전환되지 않기 때문에 조심해야하고 onStop은 메모리가 부족할 경우 실행되지 않을 수 있기 때문에 데이터 저장에 관해서 조심해야 한다.

onRestart

onStop에서 Activity로 돌아올 때 실행된다. onStart와 다른 점은 onStop이 호출된다음 onRestart가 호출되고 onStart가 호출된다. 만약 Activity가 처음 만들어질 때는 onCreate다음 onStart가 호출되며 onRestart가 호출되지 않는다.


onDestroy

onDestroy()는 활동이 소멸되기 전에 호출됩니다. 시스템은 다음 중 하나에 해당할 때 이 콜백을 호출합니다.

  1. 사용자가 활동을 완전히 닫거나 finish()를 호출하여 활동이 종료되는 경우
  2. 구성 변경(기기 회전, 멀티 윈도우 모드)로 인해 일시적으로 활동을 소멸시키는 경우

onDestroy활동이 종료되는 경우 onDestroy()는 활동이 수신하는 마지막 수명 주기 콜백이 됩니다. 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 활동 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출합니다.

  • 마지막으로 리소스를 반환하고, 저장하지 못한 데이터가 남아있으면 저장한다.
  • 액티비티가 종료되는 시점이다.

생성주기의 대칭성

리소스의 생성과 소멸은 대칭이 되는 생명주기에서 실행해야 한다.(onCreate() - onDestroy, onResume - onPause(), onStart() - onStop())

예를 들어 onCreate에 DB를 열고 onPause에 DB를 닫는 경우, onPause에서 onResume으로 상태가 되돌아오고 DB관련 작업을 진행할 때 onPause에서 DB를 닫고, onCreate를 실행하지 않았기 때문에 DB가 닫혀 에러를 발생할 수 있다.


액티비티 전환시 생명주기

onCreateA() -> onStartA() -> onResumeA() -> onPauseA() -> onCreatB() -> onStartB() -> onResumeB() -> onStopA() -> onPauseB() -> onRestartA() -> onStartA() -> onResumeA() -> onStopB() -> onDestroyB()


Dialog 띄울 때 (상관없음)

onCreateA() -> onStartA() -> onResumeA()


ContextMenu (상관없음)

onCreateA() -> onStartA() -> onResumeA()


팝업 액티비티 전환시 생명주기

(팝업은 화면이 가려지는 것이기 때문에 onStop을 호출하지 않는다 -> onStop이 호출되지 않으니 onRestart도 호출하지 않는다.)

onCreateA() -> onStartA() -> onResumeA() -> onPauseA() -> onCreateB() -> onStartB() -> onResumeB() -> onPauseB() -> onResumeA() -> onStopB() -> onDestoryB()


화면 회전시 생명주기 (Activity를 재생성함)

onCreateA() -> onStartA() -> onResumeA() -> onPauseA() -> onStopA() -> onDestoryA() -> onCreateA() -> onStartA() -> onResumeA()


태스크 매니저로 종료, Back Key로 종료시

onCreateA() -> onStartA() -> onResumeA() -> onPauseA() -> onStopA() ->onDestroyA()

'Android (안드로이드)' 카테고리의 다른 글

Android in A..Z - TextInputLayout  (0) 2021.01.20
Android in A..Z - Glide  (0) 2020.11.07
Android in A..Z - Widget  (0) 2020.08.09
Android in A..Z - Handler  (0) 2020.07.28
Android in A..Z - Notification  (0) 2020.07.27
Comments