person t-kobayashi

FlutterアプリのLifecycleを比較する

calendar_today 2021年07月14日 update 2021年07月14日
Facebook Twitter LINE はてなブックマーク Pocket

Flutterアプリのライフサイクルを理解するために、AndroidとiOSそれぞれのライフサイクルの定義を調べてみました。

Androidアプリのライフサイクル

Androidアプリというよりは、アクティビティのライフサイクルは下記のページで分かりやすく説明されています。

このページの説明によると、Androidのアクティビティには5つの状態があります。

  • initialized
  • created
  • started
  • resumed
  • destroyed

それぞれの状態から状態へ移行する際に以下のようなイベントが発動するようになっています。

  • onCreate: initializedからcreated
  • onStart: createdからstarted (初回以外はonRestartが呼ばれる)
  • onResume: startedからresumed
  • onPause: resumedからstarted
  • onStop: startedからcreated
  • onDestroy: createdからdestroyed

iOSアプリのライフサイクル

iOSアプリのライフサイクルについては、下記のページに説明があります。

Managing Your App's Life Cycle

説明によるとiOS 13移行と、iOS 12以前ではライフサイクルイベントに対応するデリゲートオブジェクトが異なり、iOS 13以降はUISceneDelegateに、iOS 12以前はUIAppicationDelegateに、UIKitからライフサイクルイベントがそれぞれ渡されるようになったとのことです。

状態の呼び方も微妙に変更されているようですが、下記のようにまとめられると思います。カッコ書きはSceneベースの状態の呼び方です。

  • Not Running (Unattached)
  • Background
  • Inactive (Foreground Inactive)
  • Active (Foreground Active)
  • Suspended

それぞれの状態間を移行する際のイベントについては、Androidの説明と比べると複雑になっていたので、ここでは割愛します。iOS 12以前の情報ですが、下記の記事でよくまとめられていると思います。

iOSアプリのライフサイクル

Flutterのライフサイクル

FlutterではWidgetsBindingObserverクラスを使って、ライフサイクルステートに変更があった場合に、AppLifecycleStateというenumで定義されている4つの状態のどの状態にあるかを確認できるようになっています。その4つ状態は以下の通りです。

  • resumed
  • inactive
  • paused
  • detached

下記の資料でも確認できますが、それぞれの状態がiOSとAndroidのどの状態に対応しているのかまとめたいと思います。

Flutter > dart:ui > AppLifecycleState

resumed

resumedの状態では、アプリが画面に表示されていて、ユーザが操作できる状態であることを示します。iOSでは「Foreground Active」または「Active」、Androidでは「Resumed」という状態と同じと考えて問題なさそうです。

inactive

この状態では、アプリは画面には表示されているが、ダイアログなどが画面の一部覆うように表示されており、フォーカスが外れている状態です。ユーザがアプリを直接操作できない状態を指します。iOSでは「Foreground Inactive」または「Inactive」、Androidでは「Started」という状態です。

paused

この状態の時、アプリは画面上には表示されておらず、バックグラウンドで待機している状態です。iOSでは「Background」、Androidでは「Created」の状態となります。

detached

この状態は、上記のどれにも当てはまらない状態です。iOSでは「Unattached」「Not Running」もしくは「Suspended」という状態、Androidでは「Initialized」または「Destroyed」という状態に対応するものであると考えられます。

まとめ

AndroidとiOSでは、アプリのライフサイクルイベントの処理に差がある場合があるように見受けられ、Flutterのライフサイクルの状態と完全に一致しない場合もあります。そのため、Flutterで作ったアプリの挙動がそれぞれのプラットフォームで異なるということがありますが、この辺りの違いを理解することでうまくコードを書き分けることができるようになるのではないかと思います。

関連記事

Flutterの記事一覧を見る

Flutterの質問

soichiro1210 が1年前に投稿

質問日時 2023年07月31日

a-sato が3年前に投稿

質問日時 2021年07月01日

a-sato が3年前に投稿

質問日時 2021年06月30日

takumi が3年前に投稿

質問日時 2021年05月20日

a-sato が3年前に投稿

質問日時 2021年05月14日

Flutterの質問一覧を見る
search