我将状态数据保存在我的activity的onSaveInstanceState函数中,并在onRestoreInstanceState中恢复该数据。此代码在95%的时间内都能正常工作。
我找到了一个测试用例,导致Android从测试到测试产生不同的结果,我不知道为什么。我有原装的Droid手机,它有一个滑出键盘。在我的应用程序中,我执行了2个测试用例,允许我重现数据未恢复的情况,因为onRestoreInstanceState没有被调用。测试几乎相同,但由于我得到的结果略有不同,显然会有一些不同的东西。
测试案例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会解决问题,但我只是运行了几次测试用例,并发现Bundle传递给onCreate的次数为null,这意味着我的数据无法恢复。
如果我不能指望onCreate中的Bundle,并且我不能指望onRestoreInstanceState被调用,剩下的是什么?是我唯一的选择onResume?此活动维护了大量数据。我应该考虑使用onRetainNonConfigurationInstance和getLastNonConfigurationInstance,在onResume中调用getLastNonConfigurationInstance吗?以前我使用过这些功能,但由于数据丢失,我放弃了它们。当时我不知道为什么,但我怀疑是因为这个确切的问题。但是当我以前使用它们时,我在onCreate中调用了getLastNonConfigurationInstance。如果从onResume调用它可能会有所不同/更好吗?