반응형
오늘은 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에서 이벤트를 받는 것을 알 수 있었습니다.
반응형
댓글