본문 바로가기

Flutter

[Flutter] App 라이프 사이클(생명주기) 관찰

개요

Flutter도 여타 안드로이드와 유사하게 앱 고유의 라이프 사이클이 존재한다. 예를 들어, 홈 버튼을 눌러 앱 화면이 더 이상 보이지 않을 때, 다시 앱으로 돌아와 화면이 보이기 시작할 때 등이 존재한다. 여기서의 라이프 사이클은 Stateful Widget에서의 라이프 사이클과 다르다. (Stateful Widget에서의 라이프 사이클은 대표적으로 위젯이 처음 초기화될 때와 위젯이 완전히 제거될 때가 일반적이다.)

 

 

라이프 사이클 종류

  • resumed: 앱이 화면에 다시 보이기 시작하는 경우, 유저의 인풋에 반응할 수 있다.
  • inactive: 앱이 비활성화되고 유저의 인풋에 반응할 수 없다.
  • paused: 앱이 유저에게 보이지 않고, 유저의 인풋에 반응할 수 없으며 백그라운드로 동작한다. (보통 inactive 이후 실행)
  • detached(suspending): 모든 뷰가 제거되고 플러터 엔진만 동작 중이며 앱이 종료되기 직전에 실행된다. 해당 상황은 앱을 스와이프로 제거하거나, 배터리가 부족해서 종료될 때, 메모리 부족으로 스왑될 경우 동작한다. 이 경우 보통 100%의 관찰을 보장하지 않는다.

 

라이프 사이클 관찰 방법

1. with를 통해 WidgetsBindingObserver를 원하는 위젯에서 불러온다.

class _ChatPageState extends State<ChatPage> with WidgetsBindingObserver {
  ...
}

 

2. 옵저버를 initState 과정에서 추가하고, dispose될 시 제거하도록 구현한다.

...
@override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
  }

...

@override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance?.removeObserver(this);
 }

 

3. didChangeAppLifecycleState를 오버라이딩하여 라이프 사이클이 변경될 때 마다 동작할 적절한 코드를 정의한다.

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch(state){
    	case AppLifecycleState.resumed:
        	break;
        case AppLifecycleState.inactive:
        	break;
        case AppLifecycleState.detached:
        	break;
        case AppLifecycleState.paused:
        	break;
    }
  }