【问题标题】:android save session state across activitiesandroid跨活动保存会话状态
【发布时间】:2012-09-12 12:58:24
【问题描述】:

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

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

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

Activity.onSaveInstanceState(Bundle outState)

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

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

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

【问题讨论】:

  • 您面临的确切问题是什么。您可以保存实例,也可以返回 bundle onactivityresult...
  • 问题在于确定哪个恢复活动有最新数据
  • 如果您不使用任何线程或类似的东西,我认为顶部的活动将具有最新数据。您可以将最新数据从孩子发送给父母......
  • 不,正如我在问题中所说,如果您正在进行某些活动并接听电话(或只是按主页按钮),然后按启动器图标(而不是找到应用程序)返回在最近的任务弹出窗口中),然后主要活动是第一个恢复的,不是你最后一个。

标签: android


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我将我的会话数据存储在应用程序中(作为单例)。问题是应用程序可以在某些低内存情况下被杀死,但活动仍然可以稍后恢复。
    • 您可以覆盖onLowMemory() 方法并更新用户关于低内存和管理应用程序状态。
    • 感谢您的建议,不幸的是,它没有被调用(至少在我正在测试的电话上)。操作系统只是在没有进一步警告的情况下终止进程:(
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多