0

跨多个活动维护会话信息的最佳方式是什么?问题在 Android 上,在整个应用程序会话的活动死亡/重新启动之间保留数据的最佳实践是什么?有一些想法,但并没有真正帮助我。

*我的应用程序有多个带有 manifest 标签的活动singleTop。它们本质上作为不同的选项卡工作——它们各自维护自己的一组片段和返回堆栈,因此将它们全部放入一个活动中会破坏用户的导航。

我目前将会话数据保存为由我的 Application 子类创建的静态单例。这在大多数情况下都可以正常工作,除非整个应用程序被操作系统杀死以节省内存(如上面的链接中所述),例如,当用户在低 RAM 的设备上接到电话时。该应用程序唯一通知它将被杀死(据我所知)是

Activity.onSaveInstanceState(Bundle outState)

所以问题是这样的onSaveInstanceState最终将在每个活动上调用,而不仅仅是最顶层的活动(当用户最终返回我的应用程序时将出现的活动)。当每个非顶级活动恢复时,我可以使用它Activity.onRestoreInstanceState(Bundle savedInstanceState)来恢复我的单例会话,但非顶级活动将拥有数据的副本(它们可能在用户接到电话之前很久就被导航了)。

一种解决方案是仅在单例会话当前为空时才将数据恢复到单例会话,但这依赖于第一个接收 Activity.onRestoreInstanceState 的活动作为顶级活动。情况并非总是如此 - 如果用户接到电话,然后通过启动器图标返回应用程序,则 Main 活动将首先恢复并提前,而不是用户接到电话时所在的活动。

Application 类中的一个简单通知,即应用程序正在被操作系统(而不是用户)杀死,这正是我需要的 - 然后我会将会话保存到文件中,并在第一次调用时将其读回Activity.onRestoreInstanceState,但是 AFAIK 这个不存在。

4

2 回答 2

3

如果您有一些数据要在应用程序关闭时存储并在应用程序启动时重新加载,您可以有一种机制在应用程序关闭和启动时存储和检索它们。为此,要覆盖 Activity 生命周期中的 onStop() 和 onStart() 方法。

在此处输入图像描述

而且我认为在这两种方法中存储和检索数据的最佳方式是SharedPreferences

于 2012-09-12T04:34:30.637 回答
0

我只会坚持使用 Application 类来保存会话。使用 Application 类,您将能够在拥有 Context 的任何地方访问会话,因此您可能可以在整个应用程序中访问。应用程序类在您的应用程序关闭后也会保留该值,因此当您的应用程序重新启动时最好清除以前的会话。

由于 Application 类的主要用途是维护变量的全局状态,以便它们可以在整个应用程序中使用更新的值。

于 2012-09-12T04:52:24.253 回答