ながれです。
Twitterのフォロワーが200人を超えました!(すごい!)
みなさまありがとうございます!
より一層、有益な情報や興味を惹かれるような情報を展開していこうと思います!
さて、今回はAndroidのアクティビティライフサイクルについてです。

Androidアプリのアクティビティライフサイクル
基本的にAndroidアプリの開発では、onCreate()
、onStart()
、onResume()
、onPause()
、onStop()
、onDestroy()
といったコールバック関数を用いて、独自の処理を埋め込んでいきます。
(コールバック関数はもっと用意されていますが、基本は上記を用います)
用意されている理由は
- アプリの使用中にユーザーが通話を受けたり、別のアプリに切り替えたりするとクラッシュする。
- ユーザーの使用頻度が低いときに貴重なシステムリソースを消費する
- ユーザーがアプリから離れ、後で復帰した場合に、アプリを離れた時点の作業状態が失われる。
- 画面の向きが横向きと縦向きとの間で切り替わったときに、クラッシュしたり、ユーザーの作業内容が失われたりする。
Android デベロッパー引用
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja
とのこと。
「アプリはユーザー操作によって様々な状態に変化するし、端末のCPUの性能はPCほど高くないから、アプリ状態は適切に保つ必要があるんだよー。だから、アプリ状態はこっち(端末側)で制御するから、あなた(開発者)はコーリバックで適切に処理してね!」ということです。
それぞれの関数は以下の時に呼ばれます。
onCreate :アクティビティ起動時(アプリを立ち上げて一番最初)。
onStart :onCreateの後やバックグラウンドからの復帰時
onResume:onStartの後
onPause :アプリ起動中に、別のアプリがフォアグラウンドに呼ばれた時やホームボタン・ランチャーボタン・電源ボタン押下によるサスペンド時
onStop :onPauseの後
onDestroy :アクティビティ破棄時。アプリ一覧から削除した時など

サスペンド復帰時のライフサイクル
通常アプリがサスペンド〜復帰した時、通常は
(サスペンド)→onPause→onStop→(サスペンド復帰)→onStart→onResume→…
上記の順番でコールバック関数が呼ばれます。(上図参照)
サスペンドするパターンは
・ホームボタン押下
・ランチャーボタン押下
・電源ボタン押下
・他アプリがフォアグラウンドに強制遷移
の4パターンです。(戻るボタンはアプリが終了し、アクティビティが破棄されるため、サスペンドではありません)
今回、取り上げたいのが電源ボタン押下によるサスペンドのパターン。
特定の端末で、電源ボタン押下によるサスペンドから復帰時、意図しないコールバック関数が呼ばれるパターンがあるのです。
確認した端末はGalaxy S9、OSはAndroid 9 Pieだったと思います。
現象を起こす手順と結果は以下です。
手順:電源ボタンによるサスペンド後、すぐ(サスペンドから3秒以内?)に復帰
結果:(サスペンド)→onPause→onStop→(サスペンド復帰)→onDestroy→onCreate→onStart→onResume→…
サスペンド復帰時に onDestroy→onCreate が呼ばれるのです。
なぜか、一度アクティビティが破棄されアクティビティを再構築します。
理由はわかりません…この現象が起こらない端末もあります。
また、サスペンドから一定時間以上(4秒以上?)経過してから復帰すると
onDestroy→onCreateが呼ばれる現象は発生しませんでした。
結局このコールバックはアプリ側でどうこうできるものありません。
対象となる端末で先ほどの現象が起きるか、確認した方が良いです。
例えば、サスペンド復帰時にサスペンド前の状態を維持する要件があった場合、満たすことができません。(アプリを1からやり直す動きをするため)
もし発生してしまう場合は、savedInstanceStateなどを使用してアプリ状態を保存してください。
以上、Androidアプリ開発をされる方は上記を注意してください。