
안녕하세요, 성조입니다.
오늘은 플러터 AppLifecycleState의 개념을 간략하게 정리하는 시간을 가져보려 합니다.
미흡한 설명은 공식 문서를 참조해주세요!
https://api.flutter.dev/flutter/dart-ui/AppLifecycleState.html
AppLifecycleState enum - dart:ui library - Dart API
AppLifecycleState enum States that an application can be in once it is running. States not supported on a platform will be synthesized by the framework when transitioning between states which are supported, so that all implementations share the same state
api.flutter.dev
AppLifecycleState 이란?
Flutter 앱이 실행 중일 때 진입할 수 있는 상태를 정의하는 열거형(enum)이다. -> 열거형이란 서로 연관된 상수 값들의 잡합을 표현하기 위해 사용되며, 각 값에는 이름이 붙어 있다. 그리고, Dart(Flutter 프레임워크를 코딩하기 위한 프로그래밍 언어)에서 열거형은 Enum 클래스를 상속받아 자동 생성되며 고정된 값 집합, 타입 안정성, 가독성 향상, 내장 메서드 제공 등이 있다.
앱라이프사이클상태는 종종 접할 수 있는 'dart:ui' 라이브러리에 정의되어 있으며, [detached, resumed, inactive, paused](hidden 상태도 존재 함(3.13 이상))로 구성되어 있으며, 플랫폼별로 지원되지 않는 상태는 프레임워크가 자동으로 보완해주고 있다.
간략하게 보기
1) detached
- 엔진은 실행 중이나, 호스트 뷰(View)와 분리된 초기, 종료 직전의 상태를 담당한다.
2) resumed
- 포커스를 가지고 디바이스 화면에 보이는 기본 실행 상태이다.
-> 평소 앱에서 보이는 그대로를 말한다고 보면 된다.
3) inactive
- 보이지만 입력 포커스를 잃은 중간 상태로 전화나 시스템 다이얼로그 등에서 사용된다.
4) paused
- 완전히 백그라운드에 들어가 디바이스 화면에 보이지 않는 상태를 의미한다.
5) hidden
- 모든 뷰가 보이지 않는 일시 정지 상태의 개념으로 3.13버전 부터 추가 된 상태이다.
개념 이해하기
1. detached
설명 -> 앱 초기화 직전 또는 호스트 뷰가 완전히 분리된 직후 상태를 의미한다.
특징
1) 엔진은 실행 중이지만, 보이는 화면인 뷰(View)가 없다
2) 앱이 시작되기 전(default), 또는 완전히 종료되기 직전
활용 예시
1) 초기 설정 로직(환경 변수 로드 -> fireabse 코드나 env 파일 환경 변수 값들을 로드하는 개념, 로깅 초기화 -> 로그 정보 확인)
2) 완전 종료 직전 자원을 해제하면서 반환하는 것(네이티브 채널 연결 종료)
2. resumed
앱이 화면에 표시되고 포커스를 받아 입력이 가능한 상태를 의미한다.
특징
1) 기본 실행 상태로, 프레임 렌더링(onBeginFrame/onDrawFrame)이 계속 호출 됨
2) 안드로이드의 경우 Activity.onResume() 이후, iOS의 foreground active 상태
활용 예시
1) 실시간 애니메이션을 재개할 때
2) 소켓, 스트리밍이 끊겼다가 다시 연결을 재개할 때
3) 포그라운드 전환 시 UI 업데이트(알림 배지 초기화 등에서 사용)
즉, 플러터의 호스트 뷰가 포커스를 얻었을 때 진입하며, 앱이 실제로 사용자와 상호작용하는 시점을 의미한다.
(티키타카가 이어지는 순간..?)
3. inactive
앱 뷰는 보이지만 입력 포커스를 잃은 상태로, 곧 백그라운드로 전환되거나 다시 포그라운드로 돌아올 준비하는 단계이다.
특징
1) 시스템 다이얼로그, 전화 통화, 앱 스위처(화면 맨 아래를 왼쪽 또는 아래로 미는 등의 앱과 화면 사이의 이동) 진입 등으로 포커스 상실한다.
2) 안드로이드의 Activity.onPause() 직후 또는 iOS의 UIViewControler 전환 시에 적용된다.
활용 예시
1) 민감 정보 마스킹(비밀번호, 결제화면 등)
2) 진행 중이던 폼 데이터 자동 저장
3) 카메라, 센서 일시 중지 등으로 사용
이 상태는 pauesd로 전환될 수 있으므로, 자원 상태를 해제해서 반환하는 것보다 디바이스에서 '일시 저장'의 개념을 중심으로 처리해야 한다.
4. paused
앱이 백그라운드로 완전히 전환되어 디바이스 화면에서 보이지 앱이 보이지 않으며, 입력도 받지 않는 상태를 의미한다. -> SNS를 사용하다가 다른 앱을 사용할 때 이런 상태로 전환된다.
특징
1) 프레임 렌더링이 중단 됨
2) 안드로이드와 iOS에서만 진입한다 (백그라운드 진입)
활용 예시
1) 장시간 작업 중단으로 네트워크 호출 취소, 타이머 중지 등의 개념이 들어간다.
-> 인스타그램 같은 경우 화면이 전환되고 네트워크 통신이 끊기기 전에 돌아오면 기존 화면으로 정상 작동되지만, 일정 시간이상 화면이 넘어간 상태에서 시간을 보내고 돌아가면 재로딩이 잰행된다.
유튜브의 경우 전환됐을 때 돌아오면 일정 시간까지는 기존 콘텐츠는 로딩되지만, 스플래쉬 화면 처럼 타 콘텐츠들을 로딩하는 방식으로 메인 영상만 캐싱해 놓는 편이다.
2) 사용자 세션, 위치 정보등을 저장할 때 사용된다.
3) 카메라 마이크 파일 스트림 등의 완전한 해제에 사용
5. hidden
앱의 모든 뷰(View)가 사용자 화면에서 완전히 사라져 더 이상 보이지 않을 때 진입하는 상태를 말한다.
특징
1) 뷰 비가시성 -> 앱이 백그라운드로 진입하거나, 팝업이나 타 앱으로 전환되어 현재 앱이 완전히 가려질 때 진입
2) 단계적 전환 -> inactive <-> paused 사이를 오갈 때 짧게 발생하며, 다른 플랫폼에서는 앱이 보이지 않는 동안 지속되는 형식이다.
3) 별도 렌더링 제어가 없다. 렌더링을 자동 중단하는 게 아니라 안보이게 만드는 것이라서 리소스 관리가 필요하다.
구조 이론 한 스푼 정리
detached
↓ init
resumed
↓ onPause
inactive
↓ ↑ onResume
├─→ hidden ──→ paused
│ ↑ ↓
└─────┘ ↑
hidden ←─────┘
detached → resumed: 앱 시작 또는 뷰가 재생성될 때
resumed → inactive: 시스템 다이얼로그, 통화, 앱 스위처 진입 등으로 포커스 상실
inactive → hidden → paused: 홈 버튼 눌러 백그라운드 진입 시(뷰가 완전히 가려질 때)
paused → hidden → inactive: 백그라운드에서 다시 포그라운드로 돌아올 때
inactive → resumed: 포커스를 완전히 회복하고 사용자와 상호작용 가능해질 때
외주 업무와 별도의 공부를 병행하느라 플러터 관련 이론을 포스팅 하는 것은 시간이 조금 걸릴줄 알았는데 생업이 겹쳐있다 보니 간략하게 기록하는 시간을 갖게 됐습니다.
부족함 많겠지만 읽고 다르게 전달 된 내용이 있다면 언제든지 댓글로 알려주시면 감사드리겠습니다.
다음 포스트에서 뵙겠습니다.
'Flutter' 카테고리의 다른 글
| [Flutter] Flutter Padding class 이해하기 (0) | 2026.01.02 |
|---|---|
| [Flutter] SingleChildScrollView 정리하기 (0) | 2026.01.01 |
| [Flutter] Bloc 상태 관리. 기초부터 심화까지 공식문서 학습하기 (1) | 2025.06.15 |
| [Flutter] StatelessWidget과 StatefulWidget의 차이점 정리 (0) | 2023.08.19 |
| [Flutter] 플러터 핫 리로드(Hot Reload)와 핫 리스타트(Hot Restart) 정리 (0) | 2023.08.16 |