为什么永远不会调用onRestoreInstanceState()

时间:2011-04-07 00:19:56

标签: android

我正在尝试在我的活动中保存数据而不是恢复它。 我将数据保存在onSaveInstanceState()上,然后尝试恢复onRestoreInstanceState()中的数据。

我设置了断点,方法onSaveInstanceState()被调用。但onRestoreInstanceState()onCreate()从未这样做过。

这是我的步骤:

  1. 开始我的Activity
  2. 按手机上的“主页”按钮。 onSaveInstanceState()被召唤。
  3. 点击启动器中的图标,然后再次启动Activity
  4. 此时,只有onRestart()被调用。但不是onRestoreInstanceState()onCreate()

    有谁知道为什么?

6 个答案:

答案 0 :(得分:16)

来自doc:

  

仅当存在要恢复的已保存状态时,系统才会调用onRestoreInstanceState()。

答案 1 :(得分:13)

好吧,如果调用onRestart(),实例变量的值将由应用程序堆栈本身维护,因此您无需还原它们。

onCreate()方法仅在调用Activity的{​​{1}}并且该进程被终止时调用。

请参阅onStop()生命周期Android Activity Life Cycle以获得清晰的理解。

您可能想要检查是否调用了Activity方法以及您的进程是否被终止。我不认为您的过程会被您描述的场景杀死。

onStop()方法非常棘手。我不知道它究竟何时被调用,但我看到它在从Potrait变为Landscape时被调用了一次。

答案 2 :(得分:6)

我之前在here

上提过了类似的问题

以下是测试onRestoreInstanceState()的一些步骤:

  1. 按主屏幕
  2. 通过adb
  3. 杀死该应用
  4. 再次启动您的应用

答案 3 :(得分:3)

请按照以下步骤操作(使用Android Studio):

  1. 创建新的Logcat过滤器,例如届时AppState
  2. 在模拟器上启动应用。你会看到:

    I / AppState:onCreate

    I / AppState:onStart

    I / AppState:onResume

  3. 按Ctl-F12旋转仿真器。你会看到:

    I / StateChange:onPause

    I / StateChange:onSaveInstanceState

    I / StateChange:onStop

    I / StateChange:onDestroy

    I / StateChange:onCreate

    I / StateChange:onStart

    I / StateChange:onRestoreInstanceState

    I / StateChange:onResume

  4. 这会通过对设备进行配置更改(例如从纵向旋转到横向)来导致活动的破坏和重新创建。

答案 4 :(得分:2)

请参阅以下链接,了解如何在真实设备或模拟器中测试onSaveInstanceState()onRestoreInstanceState()

此方法使用AlwaysFinish设置,该设置比终止进程更简单,更快捷。此方法还提供Activity - 级别控制而不是进程级别控制:

http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

答案 5 :(得分:0)

这是我对真实设备的解决方案,因此onRestoreInstanceState可以调用它。

  1. android:configChanges="orientation"中有关活动的部分中,删除此部分manifest
  2. android:screenOrientation="portrait"中有关活动的部分中删除此部分 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  3. 在您的活动中删除该行(如果有defaultPageSize = 10; defaultPageNumber =1; Response response = call3rdPartyService(defaultPageSize,defaultPageNumber,request); totalRecords = response.totalRecords(); pageNumberToIterate = (totalRecords + defaultPageSize -1 ) / defaultPageSize; for(int i=2;i<=pageNumberToIterate ;i++){ call3rdPartyService(defaultPageSize,i,request); }
  4. 在设备上启用从设置开始旋转-显示-自动旋转。

然后运行您的应用,旋转设备。 就是这样。