アプリのライフサイクル管理
アプリの状態
モバイルアプリは、アプリの起動から停止までのライフサイクルの中で様々な状態に遷移します。
ユーザが他のアプリを起動した場合、フォアグラウンドにあったアプリはバックグラウンドに移動します。ユーザが多くのアプリを起動している場合、バックグラウンドに移動したアプリがOSの判断によって停止されることもあります。
こういった、アプリのライフサイクルについてはそれぞれのOSの公式ドキュメントで詳細に説明されています。
以下は、このアプリで必要となる状態に焦点を当てて、アプリのライフサイクルを簡略化して示したものです。
React Nativeを使用したモバイルアプリでは、AppStateを利用してこれらの状態の変化を扱うことができます。それぞれの状態に遷移する代表的な操作とあわせて、以下に紹介します。
フォアグラウンドでの状態
- アクティブ(
active
)- アプリを起動したとき
- 他アプリやホーム画面からこのアプリに切り替えたとき
- 非アクティブ(
inactive
、iOSのみ)- 通知センター、コントロールセンターを開いたとき
- Appスイッチャーを表示したとき
バックグラウンドでの状態
- 一時停止(
background
) - 停止
- メモリ解放などの目的で、OSによりアプリが停止されたとき
アプリスタートの種類に応じた初期化処理
アプリをスタートする(アプリがフォアグラウンドにない状態からフォアグラウンドに表示する)とき、操作前のアプリの状態によって起動プロセスが大きく異なります。
そのため、アプリスタートの種類を操作前のアプリの状態に応じて次のように整理しておきます。
スタートの種類 | 概要 |
---|---|
コールドスタート | アプリが全く起動していない「アプリ破棄」状態からアプリを起動すること |
ウォームスタート | 「停止」状態のアプリをフォアグラウンドに表示すること |
ホットスタート | 「非アクティブ」状態や「一時停止」状態のアプリをフォアグラウンドに表示すること |
このアプリでは、アプリをフォアグラウンド化する操作として以下の方法を想定しますが、上記すべての種類に対応する必要があります。
- アプリアイコンをタップ
- ディープリンクをタップ
- 通知をタップ
- OS機能でのアプリ切替
コールドスタート、ウォームスタート
React Nativeアプリでは、コールドスタートとウォームスタートはほぼ同等です。
JavaScriptで実装されるアプリの初期化処理は、以下の処理内でアプリの初期化処理を行うことに対応します。これらの処理はコールドスタートの場合だけでなく、ウォームスタートの場合にも呼ばれるので、JavaScriptのみで実装したアプリではこれらの区別はほぼ必要ありません。
- Android: アクティビティの
onCreate
- iOS: AppDelegateの
didFinishLaunchingWithOptions
このアプリでも、コールドスタートとウォームスタートの場合にアプリの初期化処理を実行します。
ホットスタート
ディープリンクや通知をタップすることで、バックグラウンドで一時停止状態となっているアプリをフォアグラウンドに表示できます。
こういった起動方法の場合、タップしたディープリンクや通知のデータをアプリで受信して、データに応じた初期化処理を行いたいことがあります。 例えば、ディープリンクに応じて表示する画面を変更し、ディープリンクから取得したパラメータを初期値として入力欄に設定する画面などが考えられます。 詳細は以下の内容を参照してください。
なお、アプリアイコンのタップやOS機能でのアプリ切替でもアプリがホットスタートすることはありますが、そのときは以前の作業状態に戻れば良いので特別な初期化処理は行いません。
補足
ドキュメントは見つけられませんでしたが、Androidの場合はアクティビティのonResume
でactive
にし、onPause
でbackground
にしているようです。(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
UIApplication
のapplicationState
に応じて、active
,background
,unknown
のいずれか
- UIApplicationWillResignActiveNotification
inactive
- UIApplicationWillEnterForegroundNotification
background