2012年12月14日金曜日

Android2.3と4.1のActivityの挙動の違い

Android2.3と4.1でActivityの挙動が少し異なるようなので調べてみました。
ActivityにSurfaceViewが一つあるだけのアプリを作成し、onCreate、onStart、onResume、onPause、onStop、onDestroy、onSaveInstanceState、onRestoreInstanceState、surfaceCreated、surfaceChanged、surfaceDestroyed それとSurfaceViewのコンストラクタにログ出力を入れて呼ばれるタイミングを調査しました。
使用した端末
・HTC EVO (Android 2.3.4)
・Galaxy Nexus (Android 4.1.1)

1.アプリ起動後、戻るボタンで終了
2.3 4.1
onCreate onCreate
SurfaceView Constructor SurfaceView Constructor
onStart onStart
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged
戻る押下 戻る押下
onPause onPause
surfaceDestroyed surfaceDestroyed
onStop onStop
onDestroy onDestroy


これは2.3と4.1で違いはありません。

2.アプリ起動後、電源ボタンでスリープしてから復帰
2.3 4.1
onCreate onCreate
SurfaceView Constructor SurfaceView Constructor
onStart onStart
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged
電源ボタンでスリープ 電源ボタンでスリープ
onSaveInstanceState onPause
onPause onSaveInstanceState

onStop
スリープ解除 スリープ解除
onResume onRestart

onStart

onResume

スリープ時に違いが二つ有りました。
・onSaveInstanceStateとonPauseの呼び出し順が逆になっている。
・2.3はポーズ状態に遷移しているが、4.1ではストップ状態に遷移している。
アプリによっては影響がありそうなので、注意が必要です。

3.アプリ起動後、ホームボタンで一時停止後、復帰
2.3 4.1
onCreate onCreate
SurfaceView Constructor SurfaceView Constructor
onStart onStart
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged
ホームボタン押下 ホームボタン押下
onSaveInstanceState onPause
onPause surfaceDestroyed
surfaceDestroyed onSaveInstanceState
onStop onStop
復帰 復帰
onRestart onRestart
onStart onStart
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged

onSaveInstanceStateとonPauseの呼び出し順が逆になっているのはスリープ時と同じですが、4.1ではonSaveInstanceStateはさらにSurfaceDestroyedより後に呼ばれています。

4.アプリ起動後、端末を回転
2.3 4.1
onCreate onCreate
SurfaceView Constructor SurfaceView Constructor
onStart onStart
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged
回転 回転
onSaveInstanceState onPause
onPause onSaveInstanceState
onStop onStop
onDestroy onDestroy
surfaceDestroyed surfaceDestroyed
onCreate onCreate
SurfaceView Constructor SurfaceView Constructor
onStart onStart
onRestoreInstanceState onRestoreInstanceState
onResume onResume
surfaceCreated surfaceCreated
surfaceChanged surfaceChanged

これもonSaveInstanceStateとonPauseの呼び出し順が逆になっています。SurfaceDestroyedがonDestroyより後に呼ばれていますが、動きとしては共通です。


まとめ
onSaveInstanceStateがonPauseの前に呼ばれていたのが、後に呼ばれるようになったようです。ポーズ後に状態を保存するほうが合理的な気はします。ただし、呼び出し順で挙動が異なるようなアプリでは注意が要ります。
また、2.3ではストップ状態ではSurfaceDestroyedはすでに呼ばれている、あるいはすぐ後で呼ばれる(回転時)はずですが、4.1ではストップ状態に遷移しても、SurfaceDestroyed が呼ばれ無いケースがあります(スリープ時)。この辺の動きにも注意が要りそうです。
なお、手元にAndroid4.0の端末がないので試していませんが、4.1と同様の挙動だろうと思われます。

0 件のコメント:

コメントを投稿