Android:拥有永远不会被杀死的Singleton类

时间:2013-12-28 13:39:28

标签: java android service singleton task

在我的Android应用程序中,我有一个Singleton类。当应用程序任务存活时,它就像一个魅力。但是在应用程序任务被杀死之后,Singleton类被破坏了,这显然是。我需要让这堂课永远活着。可能吗?什么是使这个类从未被Android系统杀死的最佳方法,在这种情况下我是否需要使用后台服务?

3 个答案:

答案 0 :(得分:6)

使用服务来尝试确保Singleton类始终保留在内存中以便后续调用应用程序将是非常糟糕的设计。它根本不是服务的用途。请参阅:http://www.androidguys.com/2009/09/09/diamonds-are-forever-services-are-not/

如果您想确保在下次创建应用程序时保留大量数据,那么您应该选择适当的方法来保存该数据。例如,可以使用SharedPreferencesSQL或缓存等,具体取决于您要保留的数据类型。然后,设计所有Activity类以正确处理当所有Singleton数据未处于初始化状态时它们被恢复的场景。

我个人维护着一个复杂的科学应用程序,它依赖于在RAM中保存了大量的单例数据。我在开发的早期阶段遇到的一个重要问题是,有可能发生以下情况:

  • 你有三个Activity类(例如);称他们为A,B和C.
  • 您已将Singleton数据附加到Application类。
  • 用户使用该应用程序,然后导航到应用程序C.此时,已经初始化了许多Singleton数据。然后,用户导航回到家(发射器)。
  • 与此同时,您的应用程序的Application类将被销毁并创建(可能已多次)以及用户与其他应用程序交互时使用的任何Service
  • 稍后,用户会返回您的应用。 Activity栈重新开始,这意味着用户直接进入Activity C.但是,Singleton数据现在全部消失了。让Activity C以“空”未初始化的数据集启动可能会导致崩溃或向用户显示空白页。
  • 关键点:可以恢复活动堆栈,以便应用程序在活动C上恢复,即使已重新启动Application类并且所有全局数据都已从轨道运行。

为了应对上述情况,我所做的关键是确保所有活动不仅仅假设活动启动时全局(Singleton)数据存在且完好无损。我的应用程序中依赖于全局Singleton数据的每个Activity都首先检查该数据,如果它没有初始化,则调用我的Application类中的方法来触发该数据的重新生成(在我的例子中,涉及从文件中检索该数据) SD卡)。

简而言之,在Android中处理全局/单一数据需要一些关心和思考。您不能强制系统无限期地避免杀死您的应用程序,因此也不能杀死所有Singleton数据。因此,我学到的关键事项是持久化并检索数据,并设计Activity类以正确处理在创建Activity时未发现Singleton数据已初始化的情况。

答案 1 :(得分:1)

是的,你需要去后台服务。背景服务只是与其他所有组件相比具有最高优先级的组件。但是要确保或服务应该持续运行。

答案 2 :(得分:0)

尝试使用moveTaskToBack()。这应该可以解决问题。