ちょっと誤解してた&情報がなかったのでまとめてみました。
まあ Android と iOS についてですが。
画面が表示される時のイベント(コールバック)は、簡潔には以下のようになります。
順番 | イベント | iOS(UIViewController) | Android(Activity) |
---|---|---|---|
1 | 画面がロードされる(た)時 | viewDidLoad | onCreate |
2 | 画面が表示される(た)時 | viewDidAppear | onResume |
3 | 画面が非表示になる(った)時 | viewDidDisappear | onPause |
4 | 画面がアンロードされる(た)時 | viewDidUnload | onDestroy |
厳密にはもっと細かく、〜される前と後が iOS と Android で微妙に異なるのでだいたいこんな感じという程度と思って下さい。
もう少し細かいイベントは以前調べた以下を参考にしてみてください。
Xamarin.Forms では、上表のライフサイクルイベントは、アプリケーション (Application) と、画面(Page) のイベントに分かれています。
表に、Xamarin.Forms を追加してみました。
順番 | イベント | iOS(UIViewController) | Android(Activity) | Xamarin.Forms |
---|---|---|---|---|
1 | 画面がロードされる(た)時 | viewDidLoad | onCreate | Page.OnAppearing |
2 | 画面が表示される(た)時 | viewDidAppear | onResume | Application.OnResume ※要注意 |
3 | 画面が非表示になる(った)時 | viewDidDisappear | onPause | Application.OnSleep |
4 | 画面がアンロードされる(た)時 | viewDidUnload | onDestroy | Page.OnDisappearing |
画面のロード時(viewDidLoad/onCreate
)に相当するのは、Xamarin.Forms では OnAppearing
、逆にアンロード時は OnDisAppearing
です(名称が viewDidAppear
に似てるので、画面の表示時かと勘違いしてました)。
画面の表示/非表示時のイベントは、画面でなく Application クラスの OnResume
, OnSleep
で提供されます。
要注意なのは OnResume
です。これ、画面が表示される 初回はイベントが発生しません。
一度、アプリを背面に退避し、再度前面に持ってきたときに初めて OnResume
が呼び出されます。iOS や Android の viewDidAppear / OnResume
と同じだと思ってつかうとハマります。
基本的には、 OnAppearing
でリソースの確保を、 OnDisAppearing
で解放をすればよさそうです。
GPS など、電池消費の激しいリソースを使う場合は、アプリが背面へ隠れたら直ちにそのリソースを解放した方がよいです。その場合は OnResume-OnSleep
を使いますが、前述の通り、画面初回表示時は OnResume
が走らないので、少し工夫が必要です。
端末を横向きに回転すると、Android では Activity が破棄されて再度生成される事が知られています。
Xamarin.Forms では Android でもそのような事はなく、 Page.OnSizeAllocated
が呼び出されるだけです(iOS も当然同じ)。