2011/10/22

Activityのライフサイクルが保証されないケース


以前紹介したLowMemoryKiller関係で1つ。
→以前の記事

バックグラウンドにあるアプリはkillされやすいことを調査しましたが、
注意しないといけないのはLowMemoryでkillされた場合はActivityのライフサイクルが
保証されないということです。

フォアグラウンドでもkillされる可能性はありますが、バックグラウンドの場合はその
可能性がぐんとあがります。
※FOREGROUND = 空きメモリ約8MB以下でkill / HIDDEN = 空きメモリ約29MB以下でkill

空きメモリが20MBの状態でアプリ起動された場合、フォアグラウンド中はいつも通りに
操作できますが、他アプリ割り込みなどによりバックグラウンドに回った途端にこのア
プリはLowMemoryKillerのkill対象になってしまいます。
つまりはLowMemoryでkillされるため、onStop~onDestoryが呼ばれない可能性があるとい
うことです。

最近はハイスペック端末も増えて、一般には気にすることではないかもしれませんが、
・メモリ上ではなくデータベースなど永続的なストレージでフラグON/OFFを管理している
・フラグのON/OFFがActivityのライフサイクルに依存している
上記のようなアプリは期待しない状態に陥る可能性があります。

アプリが起動しなくなるような状態を避けるためにも、ライフサイクルがすべて正しく
コールされることは必ずしも保証されないことを覚えておいた方がよいでしょう。

onSavedInstanceはonStopの前に呼ばれます。これをうまく使えばkillされる直前のデータ
をうまく退避させることも可能です。