Lifecycle(앱 상태) 이벤트 1편

Lifecycle(앱 상태) 이벤트 2편
Lifecycle(앱 상태) 이벤트 3편
Lifecycle(앱 상태) 이벤트 4편
Lifecycle(앱 상태) 이벤트 5편

Intro

Flutter로 앱을 개발하다 보면 앱의 상태에 대한 체크가 필요한 시점이 있다.

앱의 상태는 단순히 보면 실행 중, 백그라운드, 앱 종료 이렇게 나눌 수 있는데, Flutter에서는 4가지의 상태로 분류하여 이벤트를 얻을 수 있게 해주는데, 앱의 상태를 확인하기 위해서는 AppLifecycleState 객체에서 detached, paused, inactive, resumed 4개의 상태를 얻을 수 있다.

4가지의 상태를 수신할 때 Android, IOS에서 받아오는 이벤트에 차이가 발생한다.

우선 각 상태에 대해서 알아보도록 하자.

Inactive

앱이 비활성화 되는 상태이며, 앱에서 발생하는 이벤트를 받을 수 없는 상태에서 변경되는 앱의 상태이다.
IOS, Android에서 앱을 백그라운드에 보낼 때 호출되거나 앱 위에서 다른 앱이 실행되는 경우 호출되는 상태라고 보면 된다.

Paused

실행 중인 앱이 화면에서 보여지지 않을 때의 상태인데, IOS, Android에서 차이점이 있다. IOS에서는 백그라운드로 보낼 때만 호출이 되는데, Android에서는 비활성화 되는 시점에도 호출이 된다.

Resumed

앱이 다시 활성화 되는 시점에서의 상태이다. 최초 앱 실행시 상태는 아니기에 헷갈리시면 안된다. inactive, paused 상태로 변경된 경우 앱을 다시 활성화를 시킬 때 호출된다.

Detached

Application이 Flutter 엔진에서 호스팅이 되지만, View가 파괴된 시점에 호출 되는 이벤트로, 앱 종료시나 네비게이터를 닫을 때 발생한다.
Flutter에서는 해당 상태가 호출되지 않고 있다. 오직 Android 시스템 백(back)키로 뷰를 파괴시킬 때만 이벤트가 호출된다고 보면 된다.


이렇게 각 상태에 대해서 살펴봤는데, 아직 이해가 잘 되지는 않을 것이다. 간단하게 보면 앱 백그라운드 상태에서의 상태는 Inactive, Paused이고, 다시 앱을 진입시 Resumed 상태가 되고, 앱을 종료할 때 Detached 상태가 된다고 보면된다.

만약에 유튜브와 같은 스트리밍 서비스를 개발한다고 할 때에 앱을 백그라운드에 보내면 스트리밍을 중지시키고, 앱을 다시 사용해달라는 푸시를 보낼 수도 있고, 다시 앱을 진입하면 스트리밍을 시작하는 기능을 만들 수 있게 된다. 또한 비즈니스 측면에서나 앱의 체류 시간 등을 확인할 때도 유용하게 사용할 수 있는 기능들이다.

하지만 여기에 문제점이 하나 있는데, 바로 앱 종료 시점에 대한 호출 이벤트가 발생하지 않고 있다는 크리티컬한 문제점이 있다. 앱 종료 상태에서는 네이티브에서도 밀리세컨 단위의 짧은 시간동안만 이벤트 처리가 가능하고, 백그라운드 프로세스는 수행하지 않는 다는 또다른 문제가 있긴 하지만 Flutter에서는 종료 이벤트 자체가 수신되지 않는다. 앱을 완전히 종료시킨 경우 종료 이벤트가 수신되는 경우는 Android 시스템 백(back)키로 뷰를 파괴할 때만 가능하다. IOS에서는 호출되지 않는다.

이러한 문제를 해결하고자 여러가지 방식으로 시도해 봤다. 가장 확실한 방법 하나를 찾았는데, 네이티브로 해결하는 방법이 하나있다. 위에서 설명했듯이 네이티브에서는 밀리세컨 단위의 시간만 이벤트를 수행할 수 있어서 원하는 기능을 백프로 수행하지는 못하지만 API 호출 정도는 수행할 수 있도록 개발을 해봤다.

마무리

이번 글에서는 앱 상태에 대해서 간단하게 살펴보았고, 다음 글에서는 Flutter에서 앱 상태를 수신 받는 방법과 네이티브에서 수신 받아 Platform Channel로 이벤트를 받아오는 방법에 대해서 작성하도록 하겠다.

Flutter에서는 stateFul과 GetX를 통해서 앱 상태를 수신 받는 방법에 대해서 알아보고, Swift, Kotlin 코드를 작성하여 네이티브에서 앱 상태를 받아오는 방법에 대해서 알아보도록 하자.

profile
Flutter Developer

0개의 댓글