3

当我想保存活动的一些状态行为时,文档说我们应该实现 OnSaveInstanceState 和 OnReceiveInstanceState。

他们说即使在销毁或重新启动后,这也会保存活动状态。我更关心销毁(活动完全消失),这是否意味着捆绑包被认为是持久的?

当我打开一个 pdf 阅读器时,关闭它并再次打开它,我看到它在我所在的同一页面中打开。这是使用 Bundles 还是其他实现的

4

6 回答 6

2

要存储持久应用程序数据,请使用Shared Preferences共享首选项只是一组持久存储的数据值。通过持久性,我们谈论的是跨应用程序生命周期事件持续存在的数据。换句话说,应用程序(或设备)可以在不丢失数据的情况下启动和停止。下次用户启动应用程序时,该数据仍然可用。一些游戏使用共享偏好来存储游戏达到的等级,玩家的名字...查看此链接了解如何使用 Android Preference API

偏好与捆绑类似但是它们是持久的,捆绑不是!请记住,如果您需要存储持久数据,您有 4 个选项来执行此操作:

  1. 使用共享首选项
  2. 使用 SQLite 数据库
  3. 使用内部存储
  4. 使用外部存储

捆绑包不是持久的,文档说不要指望它,当活动即将被系统杀死时调用 onSaveInstanceState() ,但是对于已知的重新启动(例如在屏幕旋转时)。如果您的活动被杀死因为系统需要更多资源(活动在后台时),所以不会调用 onSaveInstanceState(),但会调用 onPause()。正如文档所述,onSaveInstanceState() 并不意味着保存持久数据。

于 2012-06-23T00:51:31.130 回答
1

您可以考虑SavedInstanceState()永久保存,但不建议将其用于以持久方式保存应用程序相关数据,因为它不能保证被调用并且作者自己也不推荐它。

因此,仅将它们用于保存用户界面状态更改(背景颜色、当前选定的项目、..)并使用其他方法进行持久性,例如:SharedPreferences、文件和 SQLite。

于 2012-06-23T01:03:33.067 回答
1

捆绑包不是持久的,它们的文档指定使用它们进行持久性不是一个好主意,因为它们的内部格式可能会在设备甚至操作系统版本之间发生变化。

另一方面,SharedPreferences可以持久化,是存储当前应用程序状态等信息的推荐方式。

于 2012-06-23T00:39:31.180 回答
1

SavingActivityState的一些相关部分 :

注意:不能保证 onSaveInstanceState() 会在您的活动被销毁之前被调用,因为在某些情况下不需要保存状态(例如当用户使用后退按钮离开您的活动时,因为用户明确关闭活动)。

无法保证数据将被存储,尤其是在您的用户退出应用程序的情况下。

注意:因为不能保证调用 onSaveInstanceState(),所以你应该只使用它来记录活动的瞬态状态(UI 的状态)——你不应该使用它来存储持久数据。相反,当用户离开活动时,您应该使用 onPause() 来存储持久数据(例如应该保存到数据库中的数据)。

所以就像 K-ballo 说的,如果你有持久的数据要存储,就使用 SharedPreferences 。 onSavedInstanceState()主要用于存储 UI 相关数据。

于 2012-06-23T00:47:50.100 回答
0

正如其他人都建议使用共享偏好一样,您应该在 onDestroy 和 onSavedInstance 中都进行此保存。

当android内存不足时,它只会杀死您的应用程序并调用您的onSavedInstance而不调用onDestroy等。将您的上下文保存在传递给onSavedInstance的包中。当您的应用再次进入前台时,android 将负责恢复您的后台活动。但是这一次它会在你的 onCreate 中为每个活动传递你的包,其中将包含你在你的应用程序被杀死时保存在你的 onSavedInstance 中的所有值。

希望这可以帮助。

于 2012-06-23T01:00:39.853 回答
0

简短的回答:这不是永久性的。

长答案:来自“Android Programming - The Big Nerd Ranch Guide”:

当 onSaveInstanceState(...) 被调用时,数据被保存到 Bundle 对象中。然后,该 Bundle 对象由操作系统填充到您的活动的活动记录中

...

那么活动记录什么时候被扼杀呢?当用户按下后退按钮时,您的活动真的被彻底破坏了。此时,您的活动记录将被丢弃。活动记录通常在重新启动时也会被丢弃,如果长时间不使用也可能会被丢弃。

于 2014-09-20T03:42:56.427 回答