はじめに
Activityを保持しない場合も動作するように修正しようとしたら、ハマってしまい苦労したので備忘録として書きます。
Intentで他のアプリを起動した場合など、Activityがバックグラウンドに移動した時にメモリが足らなくなると、
もともと起動していたアプリ(Activity)を終了してメモリを確保するみたいです。
この時、アプリが復帰する動作が通常とは異なる動きをするので注意が必要です。
ただ、裏ですごいリッチでグラフィカルなゲームを起動してるとか、動かしてるアプリがめちゃめちゃメモリ喰うとか、端末が古くてすごい非力な場合とかの少し特殊な場合でしか起こり得ないことなので気づきにくいかもしれません。
結論
onActivityResultとonStartの呼び出し順が変わるので注意!!
再現方法
開発者向けオプションから「アクティビティを保持しない」の項目をONにすることで、Activityがバックグラウンドに移動した場合に常に終了するようにできます。
ライフサイクル
Activityを保持する/しないの両方共動くようにしようとしたら、思ったように動かせなくてActivityのライフサイクルの動作を確認したら次のようになっていました。
Activityを保持する場合(通常動作)
onCreate
→ onStart
→ onResume
→ (アプリを操作、startActivityForResult)
→ onPause
→ onStop
→ (Intentで他のアプリを起動) ※ここまでは一緒
→ onActivityResult
→ onStart
→ onResume
Activityを保持しない場合
onCreate
→ onStart
→ onResume
→ (アプリを操作、startActivityForResult)
→ onPause
→ onStop
→ (Intentで他のアプリを起動) ※ここまでは一緒
→ onDestroy
→ onCreate
→ onStart
→ onActivityResult
→ onResume
上記の両者を比較すれば分かると思いますが、
onStartとonActivityResultの順番が変わっています。
Activityを保持しないのでonDestroyとonCreateが増えるのは想定通りでしたが、ライフサイクルの実行順が変わるのは想定外でした。
(ライフサイクルをちゃんと理解できていないだけ?)
とりあえずonStartで設定する内容は気をつけないといけない。。。