Makopy'5 La6

スマホアプリ開発とかその周辺のこととか関係ないこと。または恋は言ってみりゃボディー・ブロー

(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の注意点

OnResumeAndroidにおける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のDidEnterBackgroundWillTerminateが呼ばれる
  • 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