繁体   English   中英

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

[英]Why onRestoreInstanceState() never gets called

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

我设置了断点,方法onSaveInstanceState()被调用。 但是onRestoreInstanceState()onCreate()从来没有。

这是我的步骤:

  1. 开始我的Activity
  2. 按手机上的“主页”按钮。 onSaveInstanceState()被调用。
  3. 单击启动器中的图标并再次启动我的Activity

此时,只有onRestart()被调用。 但不是onRestoreInstanceState()onCreate()

有谁知道为什么?

来自文档:

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

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

onCreate()方法仅在调用ActivityonStop()并且进程被终止时调用。

请参考Activity生命周期Android Activity Life Cycle以获得清晰的理解。

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

onRestoreInstanceState()方法非常棘手。 我不知道它到底是什么时候被调用的,但我看到它在从 Potrait 变为 Landscape 时被调用了一次。

我早些时候在这里问过类似的问题

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

  1. 按主屏幕
  2. 通过adb杀死应用
  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

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

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

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

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

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

  1. 在相关活动的manifest中删除这部分android:configChanges="orientation"
  2. 在相关活动的manifest中删除这部分android:screenOrientation="portrait"
  3. 在您的活动中删除此行,如果它在那里setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  4. 在您的设备上启用旋转设置 - 显示 - 自动旋转。

然后运行您的应用程序,旋转您的设备。 而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM