メインコンテンツまでスキップ

アプリのライフサイクル管理

アプリの状態

モバイルアプリは、アプリの起動から停止までのライフサイクルの中で様々な状態に遷移します。

ユーザが他のアプリを起動した場合、フォアグラウンドにあったアプリはバックグラウンドに移動します。ユーザが多くのアプリを起動している場合、バックグラウンドに移動したアプリがOSの判断によって停止されることもあります。

こういった、アプリのライフサイクルについてはそれぞれのOSの公式ドキュメントで詳細に説明されています。

以下は、このアプリで必要となる状態に焦点を当てて、アプリのライフサイクルを簡略化して示したものです。

アプリのライフサイクルフロー

React Nativeを使用したモバイルアプリでは、AppStateを利用してこれらの状態の変化を扱うことができます。それぞれの状態に遷移する代表的な操作とあわせて、以下に紹介します。

フォアグラウンドでの状態

バックグラウンドでの状態

  • 一時停止(background
    • 他のアプリやホーム画面に切り替えたとき
    • 画面がロックされたとき
    • 通知ドロワーを開いたとき(Android)
    • 最近の画面を表示したとき(Android)
  • 停止
    • メモリ解放などの目的で、OSによりアプリが停止されたとき

アプリスタートの種類に応じた初期化処理

アプリをスタートする(アプリがフォアグラウンドにない状態からフォアグラウンドに表示する)とき、操作前のアプリの状態によって起動プロセスが大きく異なります。

そのため、アプリスタートの種類を操作前のアプリの状態に応じて次のように整理しておきます。

スタートの種類概要
コールドスタートアプリが全く起動していない「アプリ破棄」状態からアプリを起動すること
ウォームスタート「停止」状態のアプリをフォアグラウンドに表示すること
ホットスタート「非アクティブ」状態や「一時停止」状態のアプリをフォアグラウンドに表示すること

このアプリでは、アプリをフォアグラウンド化する操作として以下の方法を想定しますが、上記すべての種類に対応する必要があります。

  • アプリアイコンをタップ
  • ディープリンクをタップ
  • 通知をタップ
  • OS機能でのアプリ切替

コールドスタート、ウォームスタート

React Nativeアプリでは、コールドスタートとウォームスタートはほぼ同等です。

JavaScriptで実装されるアプリの初期化処理は、以下の処理内でアプリの初期化処理を行うことに対応します。これらの処理はコールドスタートの場合だけでなく、ウォームスタートの場合にも呼ばれるので、JavaScriptのみで実装したアプリではこれらの区別はほぼ必要ありません。

  • Android: アクティビティのonCreate
  • iOS: AppDelegateのdidFinishLaunchingWithOptions

このアプリでも、コールドスタートとウォームスタートの場合にアプリの初期化処理を実行します。

ホットスタート

ディープリンクや通知をタップすることで、バックグラウンドで一時停止状態となっているアプリをフォアグラウンドに表示できます。

こういった起動方法の場合、タップしたディープリンクや通知のデータをアプリで受信して、データに応じた初期化処理を行いたいことがあります。 例えば、ディープリンクに応じて表示する画面を変更し、ディープリンクから取得したパラメータを初期値として入力欄に設定する画面などが考えられます。 詳細は以下の内容を参照してください。

なお、アプリアイコンのタップやOS機能でのアプリ切替でもアプリがホットスタートすることはありますが、そのときは以前の作業状態に戻れば良いので特別な初期化処理は行いません。

補足

ドキュメントは見つけられませんでしたが、Androidの場合はアクティビティのonResumeactiveにし、onPausebackgroundにしているようです。(react-native/AppStateModule.java at v0.63.4 · facebook/react-native

一方、iOSでは以下のイベントに対応して状態を変えているようです。(react-native/RCTAppState.mm at v0.63.4 · facebook/react-native

  • UIApplicationDidBecomeActiveNotification, UIApplicationDidEnterBackgroundNotification, UIApplicationDidFinishLaunchingNotification
  • UIApplicationWillResignActiveNotification
    • inactive
  • UIApplicationWillEnterForegroundNotification
    • background