2011/12/03

onRetainNonConfigurationInstance考察

【一般的なライフサイクル(上から順に...)】
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onRetainNonConfigurationInstance
onDestroy

【アクティビティの状態】
起動:onCreate~onResume
背面へ移動:onSaveInstanceState~onPause
停止:onStop
破棄:onDestroy

onSaveInstanceStateとonRetainNonConfigurationInstanceについて、
onRetainNonConfigurationInstanceは特別な理由がない限り画面回転用に使用します。
Activity再起動時に必要なデータはonSaveInstanceStateでBundleに格納します。

理由としてはそれぞれのAPIが呼ばれるタイミングにあります。
アプリ使用中に音声着信が割り込んだ場合を考えましょう。
音声着信割り込みで自身のActivityが背面へ移動する際にonSaveInstanceStateは呼ばれます。
つまりは、アプリの状態を保存するタイミングがあるということです。

次にonRetainNonConfigurationInstanceを考えてみましょう。
音声着信割り込みで自身のActivityが背面へ移動する際にはまだonRetainNonConfigurationInstanceは
呼ばれません。
つまり、このタイミングではアプリの状態を保存することができないということです。

注意しないといけないのは、Activityがシステムよりkillされること。
Activityが背面に回るとRUNNINGからPAUSE状態に遷移し、killされる可能性が上がります。
killされた場合はライフサイクル遷移しないためonRetainNonConfigurationInstanceは呼ばれません。

onRetainNonConfigurationInstanceについては下記のサイトが参考になります。
http://www.techdoctranslator.com/resources/articles/articles-index/faster-screen-orientation-change