2013年5月9日木曜日

データ保存のタイミングは onPause() ? onStop() ?


Android Developer の Training を読んでいたところ、
onPause() ではストレージにデータを保存せずに、
onStop() で保存するべきだと書いてありました。
onPause() では画面上に別のアクティビティが表示されるため、
時間がかかるストレージへのアクセスは控えるべきだそうです。


Pause Your Activity - Android Developer
http://developer.android.com/training/basics/activity-lifecycle/pausing.html#Pause
Generally, you should not use onPause() to store user changes (such as personal information entered into a form) to permanent storage. The only time you should persist user changes to permanent storage within onPause() is when you're certain users expect the changes to be auto-saved (such as when drafting an email). However, you should avoid performing CPU-intensive work during onPause(), such as writing to a database, because it can slow the visible transition to the next activity (you should instead perform heavy-load shutdown operations during onStop()).


一方、API Guides の Activity を読んでみると、
今度は onPause() の中でデータをストレージへ保存するように書かれています。
onPause() を実行した後は、いつアプリが強制終了するかわからないので、
onPause() の中で保存すべきとのこと。
どっちで保存すればいいんだろう・・・。

Managing the Activity Lifecycle - Android Developer
http://developer.android.com/guide/components/activities.html#Lifecycle
Because onPause() is the first of the three, once the activity is created,onPause() is the last method that's guaranteed to be called before the process can be killed—if the system must recover memory in an emergency, then onStop() andonDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage.



更に、Reference の Activity を読んでみると何となくわかりました。
上の API Guides のページでは onPause() の Killable after ? が Yes となっているのですが、Reference のページでは Pre - HONEYCOMB と書いてあります。
API Guides の Activity Lifecycle の表が古い状態のままなんだと思います。

Reference のページによると、HONEYCOMB(Android 3.0) 以降では、
onStop() が終了するまでは強制終了されないことが保証されているようです。
しかし HONEYCOMB より古いバージョンでは、onStop() が終了する前に、
強制終了されてしまう可能性があるとのことです。


Activity class - Android Developer
http://developer.android.com/reference/android/app/Activity.html
Be aware that these semantics will change slightly between applications targeting platforms starting with HONEYCOMB vs. those targeting prior platforms. Starting with Honeycomb, an application is not in the killable state until its onStop() has returned. This impacts whenonSaveInstanceState(Bundle) may be called (it may be safely called after onPause()and allows and application to safely wait until onStop() to save persistent state.

データを保存する最適なタイミングは、バージョンによって変わるようですね。
Android 3.0 より前なら onPause() で、 Android 3.0 以降なら onStop() が推奨です。
動作が遅くなるけれど両方で動く onPause() が安全だと思います。
それにしても 3.0 って微妙なラインですね。2.3系以降なら onStop() で確定なんですが・・・。

0 件のコメント:

コメントを投稿