onSaveInstanceStateが呼ばれないのはなぜか

2019年5月13日

実は、Android OSのバージョンが古い場合、onSaveInstanceStateは呼ばれないケースがあります。

Androidの公式であるAndroid Developersの見解を見ていきましょう。

 

onSaveInstanceStateはonPauseの後に呼ばれることを保証していない。

具体的にどういった場合に呼ばれないかは記載がありませんが、

Android Developersには以下のような記載があります。

引用:Android Developers

If called, this method will occur after onStop() for applications targeting platforms starting

with Build.VERSION_CODES.P. For applications targeting earlier platform versions

this method will occur before onStop() and

there are no guarantees about whether it will occur before or after onPause().

 

和訳
onSaveInstanceStateが呼び出された場合、

このメソッドは、Build.VERSION_CODES.Pで始まるアプリケーションのonStop()の後に発生します。

以前のプラットフォームのバージョンを対象としたアプリケーションの場合、

このメソッドはonStop()より前に実行され、onPause()の前後で発生するかどうかは保証されません。

onSaveInstanceStateが呼ばれないケース

onSaveInstanceStateが呼ばれないケースについての説明が公式にはないのですが、

私の経験上呼ばれない可能性が高いケースがあります。

 

それはonPauseの処理が重い場合、具体的には500ms以上かかる場合です。

 

onPauseの処理が500ms以上かかった場合に起こること

  1. Activity pause timeout for activityrecordというログが出力されます。
  2. 上記ログが出力されるとonPauseの処理が終わる前にonPauseの処理が打ち切られる可能性が高くなります。
  3. onPauseの処理が打ち切られるので後続メソッドであるonSaveInstanceStateも呼ばれません。

ここで注意したいのが、上記の2で500ms以上時間を要したからといって

必ずonPauseの処理が打ち切られるわけではなくあくまでもAndroidのシステムの判断に依存しているというところです。

 

従って何回か動作確認してonPause~onSaveInstanceStateの処理が完走したらかといって安心するのではなく、

必ず処理時間を確認して500ms未満に収まっていることを確認するのを推奨します。

 

 

onSaveInstanceStateが呼ばれない場合のまとめ

  • Android OSのバージョンが古い場合はonSaveInstanceStateは必ず呼ばれる保証がない
    • 具体的OSのバージョンは明言できないのですが、5系未満だと呼ばれない可能性があると思ってください。
      (2系では呼ばれないケースが発生していたのは覚えているのですが、3系と4系はうろ覚えです。ごめんなさい。)
  • onPauseの処理に500ms以上の時間がかかると、onSaveInstanceStateが呼ばれない可能性が高い