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