(Xamarin.Forms)アプリのライフサイクル
ライフサイクルの捕捉
ライフサイクルの捕捉は、スマホアプリ開発において非常に重要です。
機能要件や実装都合等の事情により、
ライフサイクルのタイミングに合わせて処理をする。
ということがしばしばあるからです。
ライフサイクルは大きく2つに分けられます。
- アプリのライフサイクル
- 画面のライフサイクル
今回は「アプリのライフサイクル」について書きます!
Xamarin.Formsにおけるアプリのライフサイクル
公式のDevelopersガイドに記載があります。
https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/app-lifecycle/
Application
クラスには、以下の3つのライフサイクルメソッドが存在します。
- OnStart
- アプリケーションの起動時に呼び出される
- OnSleep
- アプリケーションがバックグラウンドに移動するたびに呼び出される
- OnResume
- アプリケーションがバックグラウンド遷移後、再開されたときに呼び出される
泣いても笑ってもこの3つしかありません。
以下ではこの3つのライフサイクルメソッドが呼び出されるタイミングを調査します。
呼び出されるタイミングについて調査
- Appクラス
- .DroidのMainActivity.cs
- .iOSのAppDelegate.cs
のそれぞれのライフサイクルメソッドにログを張って、
- 起動
- バックグラウンド
- フォアグラウンド
に関連しそうな操作をしてみました。
調査そのものに関係ないのですが…。
.iOSのAppDelegateのライフサイクルメソッド名がネイティブとだいぶイメージが違うなぁと思いましたw
iOSネイティブが大好物な人なので、違和感ありありですw
調査結果から見たポイント
調査ログを延々と記載する前に…。
先に結論というかポイントをまとめておきますw
OnResumeの注意点
OnResume
はAndroidにおけるOnResume
と違って、起動時は呼ばれない
OnSleep/OnResumeの注意点
iOSでは、本来バックグラウンドと見なしたくない下記のタイミングで、OnSleep
/OnResume
が呼ばれてしまう。
- 通知センターの表示/非表示
- コントロールセンターの表示/非表示
実際にはバックグラウンド/フォアグラウンドではなく、アクティブ/インアクティブに紐づいてしまっている。
従って、
OnSleepが呼ばれるタイミングは必ずしもバックグラウンドではない
ということで、以下調査ログの記録です。
iOS
起動時
- Appの
OnDestroy
がAppDelegateのWillFinishLaunching
の直後に呼ばれる
AppDelegate.cs - WillFinishLaunching AppDelegate.cs - FinishedLaunching App.xaml.cs - .ctor App.xaml.cs - OnStart AppDelegate.cs - OnActivated
ホームボタン押下時
- Appの
OnDestroy
がAppDelegateのOnResignActivation
の直後に呼ばれる
AppDelegate.cs - OnResignActivation App.xaml.cs - OnSleep AppDelegate.cs - DidEnterBackground
ホームボタン押下後、マルチタスク画面から選択
- Appの
OnResume
がAppDelegateのOnActivated
の直後に呼ばれる
AppDelegate.cs - WillEnterForeground AppDelegate.cs - OnActivated App.xaml.cs - OnResume
ホームボタン押下後、アプリアイコンから起動
- Appの
OnResume
がAppDelegateのOnActivated
の直後に呼ばれる
AppDelegate.cs - WillEnterForeground AppDelegate.cs - OnActivated App.xaml.cs - OnResume
マルチタスク画面表示時
- Appの
OnSleep
がAppDelegateのOnResignActivation
の直後に呼ばれる
AppDelegate.cs - OnResignActivation App.xaml.cs - OnSleep
マルチタスク画面から再選択
- Appの
OnSleep
がAppDelegateのOnResignActivation
の直後に呼ばれる
AppDelegate.cs - OnActivated App.xaml.cs - OnResume
通知センター表示
- Appの
OnSleep
がAppDelegateのOnResignActivation
の直後に呼ばれる
AppDelegate.cs - OnResignActivation App.xaml.cs - OnSleep
通知センター非表示
- Appの
OnResume
がAppDelegateのOnActivated
の直後に呼ばれる
AppDelegate.cs - OnActivated App.xaml.cs - OnResume
コントロールセンター表示
- Appの
OnSleep
がAppDelegateのOnResignActivation
の直後に呼ばれる
AppDelegate.cs - OnResignActivation App.xaml.cs - OnSleep
コントロールセンター非表示
- Appの
OnResume
がAppDelegateのOnActivated
の直後に呼ばれる
AppDelegate.cs - OnActivated App.xaml.cs - OnResume
マルチタスク画面からアプリKill
- AppDelegateの
DidEnterBackground
とWillTerminate
が呼ばれる - Appのライフサイクルメソッドは呼ばれない
AppDelegate.cs - DidEnterBackground AppDelegate.cs - WillTerminate
Android
アプリ起動時
- Appの
OnStart
がActivityのOnStart
の直後に呼ばれる - Activityの
OnResume
は呼ばれるが、AppのOnResume
は呼ばれない
MainActivity.cs - OnCreate App.xaml.cs - .ctor MainActivity.cs - OnStart App.xaml.cs - OnStart MainActivity.cs - OnPostCreate MainActivity.cs - OnResume MainActivity.cs - OnPostResume
ホームボタン押下時
- Appの
OnSleep
がActivityのOnStop
の直後に呼ばれる
MainActivity.cs - OnUserLeaveHint MainActivity.cs - OnPause MainActivity.cs - OnSaveInstanceState MainActivity.cs - OnStop App.xaml.cs - OnSleep
ホームボタン押下後、アプリ一覧から選択
- Appの
OnResume
がActivityのOnRestart
の直後に呼ばれる
MainActivity.cs - OnRestart App.xaml.cs - OnResume MainActivity.cs - OnStart MainActivity.cs - OnResume MainActivity.cs - OnPostResume
ホームボタン押下後、アプリアイコンから起動
- Appの
OnStart
がActivityのOnStart
の直後に呼ばれる - Activityの
OnResume
は呼ばれるが、AppのOnResume
は呼ばれない
MainActivity.cs - OnCreate App.xaml.cs - .ctor MainActivity.cs - OnStart App.xaml.cs - OnStart MainActivity.cs - OnPostCreate MainActivity.cs - OnResume MainActivity.cs - OnPostResume
マルチタスクボタン押下時
- Appの
OnSleep
がActivityのOnStop
の直後に呼ばれる
MainActivity.cs - OnUserLeaveHint MainActivity.cs - OnPause MainActivity.cs - OnSaveInstanceState MainActivity.cs - OnStop App.xaml.cs - OnSleep
マルチタスクボタン押下後、アプリ一覧から再選択
- Appの
OnResume
がActivityのOnRestart
の直後に呼ばれる
MainActivity.cs - OnRestart App.xaml.cs - OnResume MainActivity.cs - OnStart MainActivity.cs - OnResume MainActivity.cs - OnPostResume
通知バー表示
- 何も呼ばれない
アプリ一覧からアプリKill
- Activityの
OnDestroy
が呼ばれる - Appのライフサイクルメソッドは呼ばれない
MainActivity.cs - OnDestroy