본문 바로가기
개발/Flutter

[Flutter] Flutter LifeCycle Event와 Android LifeCycle Event 비교하기

by tempus 2022. 12. 23.
반응형

오늘은 Flutter에서 LifeCycle Event와 Android Activity에서 LifeCycle Event가 어떻게 연관되어 있는지 확인해보려고 합니다. 이는 Flutter 내에서 플랫폼 별 코드를 작성할 때 알아두면 유용할 수 있습니다. 

본 코드들은 Android Studio에서 실행하였습니다. 

 

Flutter에서 LifeCycle Event를 수신받기 위해서는 WidgetsBindingObserver를 State에 mixin 합니다. 코드는 아래와 같습니다.

class GetScreenStateState extends State<GetScreenState> with WidgetsBindingObserver{
 
  @override
  void initState() {
    //앱 상태 변경 이벤트 등록
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }
 
  @override
  void dispose() {
    //앱 상태 변경 이벤트 해제
    super.dispose();
  }
 
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        print("resumed");
        break;
      case AppLifecycleState.inactive:
        print("inactive");
        break;
      case AppLifecycleState.paused:
        print("paused");
        break;
      case AppLifecycleState.detached:
        print("detached");
        break;
    }
 
  }
 
/**
* 다른 코드 생략
**/
}

 

Android에서는 Application 클래스 내에 ActivityLifecycleCallbacks을 통해 확인해보았습니다.

class BaseApplication : Application() {
 
    override fun onCreate() {
        super.onCreate()
 
        val mActivityLifecycleCallbacks: ActivityLifecycleCallbacks =
            object : ActivityLifecycleCallbacks {
                override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
 
                    Log.d("flutter", "onActivityCreated")
                }
                override fun onActivityStarted(activity: Activity) {
                    Log.d("flutter", "onActivityStarted")
                }
                override fun onActivityResumed(activity: Activity) {
                    Log.d("flutter", "onActivityResumed")
                }
                override fun onActivityPaused(activity: Activity) {
                    Log.d("flutter", "onActivityPaused")
                }
                override fun onActivityStopped(activity: Activity) {
                    Log.d("flutter", "onActivityStopped")
                }
                override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
                    Log.d("flutter", "onActivitySaveInstanceState")
                }
                override fun onActivityDestroyed(activity: Activity) {
                    Log.d("flutter", "onActivityDestroyed")
                }
            }
 
        registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
    }
 
}

비교 결과

로그 색깔

  • 초록색 : Android
  • 파란색 : Flutter

1. 최초 앱 실행 시

앱을 최초 실행할 때는 Flutter의 AppLifecycleState.resumed는 동작하지 않았습니다.

최초 앱 실행 시 로그 파일

2. 앱 백그라운드 실행 목록에 있다가 다시 실행 시

우측 하단 버튼을 눌러 앱 백그라운드 실행 목록으로 갈 때는 onActivityPaused → onActivityStopped까지 실행합니다. 이때 flutter는 inactive → paused까지 실행합니다.

이후 다시 앱을 포그라운드로 부르면 resumed가 호출이 됩니다. 

앱 백그라운드 실행 목록에 있다가 다시 실행 시 로그 파일

3. 앱 종료 시 (뒤로 가기 버튼)

앱 종료 시 (뒤로가기 버튼) 로그 파일

4. 앱 종료 시 (백그라운드 실행 목록에서 제거)

앱 종료 시 (백그라운드 실행 목록에서 제거) 로그 파일

 

최종 결론

결론적으로 아래와 표와 같이 Flutter와 Android에서 이벤트를 받는 것을 알 수 있었습니다.

 

 

반응형

댓글


loading