3

状態データをアクティビティの onSaveInstanceState 関数に保存し、そのデータを onRestoreInstanceState に復元します。このコードは 95% の確率で問題なく動作します。

Android がテストごとに異なる結果を生成する原因となるテスト ケースを見つけましたが、その理由がわかりません。私はオリジナルの Droid フォンを持っていて、キーボードがスライド式になっています。私のアプリでは、onRestoreInstanceState が呼び出されないためにデータが復元されない状況を再現できる 2 つのテスト ケースを実行します。テストはほぼ同じですが、わずかに異なる結果が得られたため、明らかに少し異なるものがあります.

テスト ケース 1 (縦向きモードの電話、キーボード入力):

1. Populate the Activity with data
2. Press my phone's power button to purposely dim the screen. (The phone is now locked)
3. Immediately after step 2, slide out my phone's keyboard, switching the phone to landscape mode.
4. About 80% of the time, the screen lights up, giving me the option to unlock the phone. (See difference in other test case).
5. Unlock the phone, which immediately takes me to my last Activity. Function onRestoreInstanceState is not called about 75% of the time.

テスト ケース 2 (横向きモードの電話、キーボードが表示されていない):

1. Populate the Activity with data
2. Press my phone's power button to purposely dim the screen. (The phone is now locked)
3. Immediately after step 2, slide in my phone's keyboard, switching the phone to portrait mode.
4. Majority of the time, the screen is not lit up. I have to press my phone's power button to light the screen up, which then allows me to unlock the phone.
5. Unlock the phone, which immediately takes me to my last Activity. Function onRestoreInstanceState is not called about 20% of the time.

テスト ケース 1 では、約 60% の確率でデータが復元されません。テスト ケース 2 では、約 20% の確率でデータの復元に失敗します。私が本当に際立っている唯一の違いは、キーボードを押し込んだり引き出したりした後に画面が点灯することです. その画面が点灯すると、ほぼ毎回データが失われます。

画面を暗くしてから、電話のロックを解除してアプリに戻る前に、キーボードを約 10 回連続して出し入れすると、ほぼ100% の確率でこの問題が再現されます。

データが正常に復元された場合の呼び出しシーケンスは次のとおりです。

onSave
onStop
onDestroy
onCreate
onStart
**onRestore**
onResume

データが正常に復元されなかったすべてのケースで、呼び出しシーケンスは次のとおりでした。

onSave
onStop
onDestroy
onCreate
onStart
onResume

誰かがここで何が起こっているのか教えてもらえますか? 同じ正確なテストを実行しても、異なる結果が得られるのはなぜですか? テスト ケース #1 (または #2) を何度も実行すると、結果が同じになることはありません。なぜこれが起こっているのかを理解したいのですが、もっと重要なのは(決定的な答えが不可能な場合)、データを毎回保存したいだけなので、どうすればよいですか?onRestoreInstanceState にあるコードを onCreate に移動すると問題が解決すると思っていましたが、テスト ケースを数回実行したところ、onCreate に渡された Bundle が null である場合があり、データが復元されないことがわかりました。

onCreate の Bundle を当てにできず、onRestoreInstanceState が呼び出されるのを当てにできない場合、何が残るでしょうか? 私の唯一のオプションは onResume ですか? このアクティビティは、大量のデータを維持します。onRetainNonConfigurationInstance と getLastNonConfigurationInstance を使用して、onResume で getLastNonConfigurationInstance を呼び出すことを検討する必要がありますか? 以前はこれらの機能を使用していましたが、データ損失が発生したため使用をやめました。当時は理由がわかりませんでしたが、まさにこの問題が原因だったのではないかと思います。しかし、以前に使用したときは、onCreate で getLastNonConfigurationInstance を呼び出しました。onResume から呼び出された場合、おそらく異なる/より良いでしょうか?

4

0 に答える 0