Android中的静态单例生命周期

我有一些不清楚的情况:

在最后一个引用持有Activity之后,静态单例会被垃圾收集吗? 因为应用程序中没有更多的引用单例实例。 我可以依靠单身吗?

由官方的Android文档 :

通常不需要子类Application。 在大多数情况下,静态单例可以以更模块化的方式提供相同的function。

通过一些post:

https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

在开发一个应用程序的时候, 我发现有时候绑定到活动的静态variables偶尔会被初始化, 我认为,当一个静态variables被初始化时,它在应用程序的整个生命周期中保持这种状态,但是这似乎并不是这样。

换句话说,如果什么都没有引用我的静态单例类,什么是防止垃圾收集和销毁?

Solutions Collecting From Web of "Android中的静态单例生命周期"

不,因为如果它是一个单例,它在类中被存储为一个static字段,通常单例不会被客户端销毁,也就是说,你不会放置一个静态方法deleteInstance() ,它将引用设置为null这样如果其他人使用它,它有资格进行垃圾收集。 对于静态字段,抛弃加载类的类加载器时会发生垃圾回收。

由于这个原因,关键字static本身可能会导致内存泄漏,如果它引用了Activity对象,所以在使用它的时候应该非常小心。

您无法控制Java对象何时变成垃圾收集。 当没有更多(非循环)引用的对象时,对象就有资格进行垃圾回收。 随着Android,进一步,你不能控制当你的活动从内存中删除。

单身人士应该代表一直存在的东西。

  • 你不能强制任何物体被垃圾收集。 您可以请求使用System.gc()运行垃圾收集器,但它只是一个请求。

  • 如果你想让一个单身人士有资格进行垃圾收集,你可能想要一个方法来将静态variables设置为null(并且希望没有别的东西需要引用的副本)。 很明显,下次有人要求一个实例时,就需要重新创build。 当然,这不是一个单身人士。

是。 每当你离开你的应用程序(例如,你的应用程序打开相机应用程序来拍照,或打开浏览器打开链接,或用户只是推后退button)有可能是你的Application对象将被销毁当您导航回到您的应用程序时重新创build。

您应该在自定义Application类的静态variables中初始化任何静态variables(如果有),或者在您的Activities中确保它们不会为空。

请注意,在硬件较弱,内存较低的设备上遇到此问题的可能性较大,但您应该预料可能会在任何设备上发生此问题。

底线是,在android中,不要指望你的静态variables会随时留在内存中。 经常检查它们是否存在,并在必要的地方重新初始化它们。

编辑:

我知道这已经很长时间了,我完全忘记了这个线程,无论如何,这里是官方Android生命周期文档的来源:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

即使活动被破坏,所有的单身物件也将保留。