2011/12/16

onPause中にアプリが突然killされるケース

ActivityのonPause処理中に突然プロセスkillされることがあります。
つまりonPauseが完走しないケースが"あり得る"ということです。

プロセスをkillするのはLowMemoryKiller。
LowMemorykillerはフォアグラウンドプロセスをkillすることもありますが、ごく稀です。
killされる可能性が高くなるのはアプリがバックグラウンドにまわったpause状態の時。
Activityはforeground状態よりもpause状態の方がkillされる可能性がぐんと上がります。
通常、Activityがpause状態に遷移するのはonSavedInstance~onPauseが終わった後です。
しかし例外があります。

onSavedInstance開始~onPause終了に500msec以上かかった場合、ActivityManagerはActivity
のonPause完了を待たずにpause状態へと無理やり遷移させます。
その際下記のようなログがmainログに吐かれます。

W/ActivityManager(86): Activity pause timeout for ActivityRecord{ ... }

そのため、onPauseメソッドはActivityのpause状態で実行されることがあり、
onPauseの途中でプロセスがkillされてしまうとonPauseが完走しません。

とはいえ、バックグラウンドで10以上のアプリを起動していたりする場合に起こり得るケースで
あるため、これも稀なケースと言えます。