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 件のコメント:
コメントを投稿