当我想保存活动的某些状态行为时,文档说我们应该实现OnSaveInstanceState和OnReceiveInstanceState。
他们说即使在销毁或重启后,这也会保存活动状态。我更关心破坏(活动完全消失),这是否意味着捆绑被认为是持久的?
当我打开一个pdf阅读器时,将其重新打开并再次打开它,我看到它在我所在的同一页面中打开。这是使用Bundles还是其他方式实现的
答案 0 :(得分:2)
要存储持久性应用数据,请使用共享首选项。 共享首选项只是持久存储的数据值集。通过持久性,我们讨论的是在应用程序生命周期事件中持续的数据。换句话说,可以启动和停止应用程序(或设备),而不会丢失数据。用户下次启动应用程序时,该数据仍然可用。 有些游戏使用共享偏好来例证存储游戏的等级,玩家的名字...... 请参阅此link以了解如何使用Android Preference API
偏好类似于捆绑但是它们是持久的而捆绑不是!! 请记住,如果您需要存储持久数据,则有4个选项可以执行此操作:
Bundles 不是持久性的,文档说不要依赖它,当活动即将被系统杀死时调用onSaveInstanceState(),但是对于已知的重启(对于 屏幕旋转时的实例。)如果您的活动被杀死,因为系统需要更多资源(而 活动在后台),onSaveInstanceState()不会被调用,但onPause()会被调用。的onSaveInstanceState() 真的不是为了保存持久性数据,正如文档所述。
答案 1 :(得分:1)
Bundles 不是持久的,并且它们的文档指定将它们用于持久性并不是一个好主意,因为它们的内部格式可能会在设备甚至OS版本之间发生变化
另一方面,SharedPreferences 可以保留,并且是存储当前应用状态等信息的推荐方式。
答案 2 :(得分:1)
SavingActivityState的一些相关部分 :
注意:无法保证在销毁活动之前调用onSaveInstanceState(),因为在某些情况下不需要保存状态(例如用户时)使用“返回”按钮离开活动,因为用户明确关闭了活动。
无法保证数据存储,尤其是在您的用户退出应用的情况下。
注意:因为不能保证调用onSaveInstanceState(),所以你应该只使用它来记录活动的瞬态(UI的状态) - 你永远不应该用它来存储持久数据。相反,当用户离开活动时,您应该使用onPause()来存储持久数据(例如应该保存到数据库的数据)。
就像K-ballo所说的那样,如果要存储持久性数据,则使用SharedPreferences。 onSavedInstanceState()
主要用于存储与UI相关的数据。
答案 3 :(得分:1)
您可以 sorta 认为SavedInstanceState()
是永久性的,但不建议将其用于以持久的方式保存应用程序相关数据,因为它不能保证被调用,并且作者不推荐自己。
所以,仅使用它们来保存用户界面状态更改(背景颜色,当前选定的项目,..)并使用其他方法进行持久化,如:SharedPreferences,Files和SQLite。
答案 4 :(得分:0)
正如其他人一样,建议使用共享首选项,您应该在onDestroy和onSavedInstance中保存。
当android在内存上运行不足时,它只会杀死你的应用程序并调用你的onSavedInstance而不调用onDestroy等。将你的上下文保存在它传递给onSavedInstance的bundle中。当你的应用程序再次进入前台时,android将负责恢复你的后台堆栈活动。但是这次它会在你的onCreate中为你的每个活动传递一个包,这个活动将包含你在应用程序被杀死时保存在onSavedInstance中的所有值。
希望这有帮助。
答案 5 :(得分:0)
简短回答:这不是永久性的。
答案很长:来自“Android编程 - 大书呆子牧场指南”:
当调用onSaveInstanceState(...)时,数据将保存到 捆绑对象。然后将Bundle对象填充到您的活动中 OS的活动记录
...
那么活动记录何时被扼杀?当用户按下时 后退按钮,你的活动真的被摧毁了,一次又一次 所有。此时,您的活动记录将被丢弃。活动 记录通常也会在重新启动时丢弃,也可能是 如果他们长时间不使用就丢弃。