2012-09-12 220 views
0

跨多个活动维护会话信息的最佳方式是什么? What is the best practices on Android to keep data between activities deathes/restarts for the whole application session?这个问题有一些想法,但并没有真正帮助我。android跨会话保存会话状态

*我的应用程序有多个活动,清单标记singleTop。它们本质上是作为不同的选项卡工作的 - 它们分别维护它们自己的一组碎片并返回堆栈,因此将它们全部放入一个活动中会破坏用户的导航。

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

Activity.onSaveInstanceState(Bundle outState)

所以,问题是这样的onSaveInstanceState最终将在活动叫,不只是最上面的一个(当用户最终返回到我的应用程序时将出现的那个)。当每个非顶级活动恢复时,我可以使用Activity.onRestoreInstanceState(Bundle savedInstanceState)来恢复我的单身人士会话,但非顶级活动可能会有旧的数据副本(它们可能在用户接到呼叫之前很久就离开了)。

一个解决方案是仅将数据恢复到单例会话只有当前为空,但这依赖于第一个活动来接收Activity.onRestoreInstanceState作为最高活动。情况并非总是如此 - 如果用户接到电话然后通过启动器图标返回到应用程序,那么主要活动将首先恢复,并且提前,而不是用户接到电话时的活动。

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

+1

你面对的确切问题是什么?你可以保存实例,你也可以返回bundle onactivity结果... –

+0

问题是确定**哪些**恢复活动有最新的数据 – rockgecko

+0

我认为如果您不使用任何线程或类似的东西,顶部的活动将有最新的数据。您可以将最新的数据从孩子发送给家长...... –

回答

3

如果在应用程序启动时应用程序关闭并重新加载时需要存储一些数据,则可以使用机制在应用程序关闭和启动时存储和检索它们。要做到这一点,将覆盖Activity的生命周期中的onStop()和onStart()方法。

enter image description here

我认为存储和这两种方法获取数据是SharedPreferences的最佳途径。

0

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

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

+0

是的,我**我的会议数据存储在应用程序(作为一个单身人士)。问题是Application可能会在一些内存不足的情况下被杀死,但活动仍然可以在稍后恢复。 – rockgecko

+0

您可以重载'onLowMemory()'方法并更新用户低内存并管理应用程序状态。 –

+0

感谢您的建议,不幸的是,它没有被调用(至少在我测试的电话上)。操作系统只是杀死进程没有进一步警告:( – rockgecko