Activity
- 사용자와 앱과 상호작용하기 위한 진입점
- 앱이 UI를 그리는 창을 제공
- 한 앱이 다른 앱을 호출할 경우, 앱 전체를 호출하는 것이 아닌 Activity를 호출
main()
메서드를 사용하여 앱을 실행하는 프로그래밍 패러다임과는 달리 Activity 수명주기의 특정 단계에 해당하는 특정 콜백 메서드를 호출하여 Activity를 시작함
- 매니페스트 파일에
<activity>
로 선언
Activity 수명주기
onCreate()
- 생성됨
- 시스템이 Activity를 생성할 때 실행됨
- Activity의 전체 수명주기 동안 한 번만 발생해야 하는 시작 로직을 수행하고 필수 구성요소를 초기화해야 함 (
setContentView()
호출 및 레이아웃 정의 등)
- lifecycle-aware 컴포넌트에게
ON_CREATE
이벤트 전달
- 완료 후 시작됨 상태로 전환 및
onStart()
호출
onStart()
- 시작됨
- Activity가 사용자에게 표시됨
- Activity가 Foreground에서 사용자와 상호작용하기 위한 최종 준비 작업을 설정해야 함
- lifecycle-aware 컴포넌트에게
ON_START
이벤트 전달
- 완료 후 재개됨 상태로 전환 및
onResume()
호출
onResume()
- 재개됨
- Activity가 Foreground에 보여지며 사용자와 상호작용할 수 있는 상태
- 포커스를 잃기 전까지
onResume()
에 머묾
- 앱 핵심 기능의 대부분을 설정해야 함
- lifecycle-aware 컴포넌트에게
ON_RESUME
이벤트 전달
- 포커스를 잃게끔 하는 이벤트 발생시, 일시중지됨 상태로 전환 및
onPause()
호출
- 일시중지됨 상태에서 재개됨 상태로 전환시
onResume()
이 다시 호출되므로, onPause()
에서 해제한 리소스를 다시 초기화해주어야 함
onPause()
- 일시중지됨
- Activity가 포커스를 잃고 '일시중지됨' 상태로 전환될 때 호출됨
- Activity가 부분적으로 표시되지만, 사용자가 활동을 떠나고 있으며 Activity가 조만간 '중지됨' 또는 다시 '시작됨' 상태로 전환될 것을 나타냄
- lifecycle-aware 컴포넌트에게
ON_PAUSE
이벤트 전달
onResume()
에서 초기화한 리소스의 경우, onPause()
에서 해제
- 사용자가 다시 Activity로 돌아갈 경우
onResume()
, Activity가 완전히 보이지 않게 될 경우 onStop()
호출
onStop()
- 중단됨
- Activity가 더 이상 사용자에게 보이지 않아 '중단됨' 상태로 전환될 때 호출
- lifecycle-aware 컴포넌트에게
ON_STOP
이벤트 전달
onStart()
에서 초기화한 리소스의 경우, onStop()
에서 해제
- 사용자가 다시 Activity로 돌아갈 경우
onRestart()
, Activity의 실행을 종료할 경우 onDestroy()
호출
onDestroy()
- 소멸됨
- Activity가 소멸되기 전 호출
- Activity의 모든 리소스를 해제해야 함
- 메모리 부족, 화면 회전 등 시스템의 제약조건으로 인해 Activity가 소멸된 경우, 해당 Activity의 인스턴스를 재생성하고
onCreate()
를 호출함
- lifecycle-aware 컴포넌트에게
ON_DESTROY
이벤트 전달
Activity 상태 저장
- 사용자가 앱 사용 중 화면을 회전하거나 multi-window로 전환할 경우, Activity가 소멸되어 새로 생성되지만 사용자는 UI 상태가 동일할 것으로 기대함
ViewModel
과 onSaveInstanceState()
등을 이용하면 시스템의 제약조건으로 인해 Activity가 소멸될 경우를 대비하고 사용자에게 동일한 UI 상태를 제공할 수 있음
onSaveInstanceState()
- 시스템이 Activity 또는 Fragment를 소멸시켰을 경우, 이를 재생성하고 UI 상태를 재로드하기 위한 데이터를 저장하는 callback
- Saved instance state bundles는 구성 변경이나 시스템의 프로세스 중단에도 유지됨
- 디스크에 데이터를 직렬화하여 저장하기 때문에 기기 성능(저장 용량 및 속도)에 영향을 받고
ViewModel
에 비해 속도가 느림
- 작업이 메인 스레드에서 진행되므로 직렬화된 데이터가 복잡할 경우, 프레임 드롭 또는 시각적 끊김 현상이 발생할 수 있음
📝 References