Android活动和服务生命周期中的单身人士

时间:2015-10-16 19:26:42

标签: android

我正在尝试使用一个静态单例DataManager来发出网络请求并保存我的Activity数据数组,在我的Activity onCreate()类中实例化,但是每次都会破坏Activity的想法有一个方向改变正在绊倒我。每次用户更改方向或返回到屏幕时,我都不想重新创建新的单例并使用数据重新填充它。

即使我将DataManager作为服务,如果我将其设为绑定服务,似乎每当我的Activity被销毁时服务都会被销毁,但是如果我不能使它成为绑定服务并使用{{我的Activity中有1}}和startService(),每当我的Activity被销毁时它也会被销毁。

另外,如果我使用stopService()onSaveInstanceState()来保存我的单例实例,那么当我的Activity处于非活动状态时,我的单例可能会被销毁,因为不再有指向它的指针。然后,使用相同DataManager类的Activity B可以创建另一个DataManager实例,而Activity A处于非活动状态。然后,活动A醒来,给另一个数据管理器充气,为我们提供2个不再是单例的DataManagers,可能会有不一致的数据。

我已阅读elsewhere我不应将Application子类化为维护应用状态,但我不明白它是如何以其他方式工作的。谢谢你的任何澄清。

2 个答案:

答案 0 :(得分:0)

对应用程序类进行子类化,然后在application.onCreate()回调中实例化您的单例。这样,它将在您的应用程序的生命周期内使用,而不是单个活动的生命周期。小心这不会被垃圾收集,直到有人杀死你的应用程序,所以没有太多的“全球”单身人士。

答案 1 :(得分:0)

不要Application.onCreate()中完成工作。无论发生什么情况,您都会放慢启动应用程序的速度。对于Android应用程序,建议不要这样做,您希望应用程序能够立即启动。

相反,如果你真的需要一个单例,那么在必要的时候让它懒惰地构造。(如果你确定你会使用它,你也可以在你的活动开始时从一个单独的线程异步强制构造)。当你的活动被摧毁时,并不意味着整个过程会立即被拆除,所以你的单身人士将会活着。

此外,如果您使用单件,请确保在内存不足时能够清除它。您需要实现Application.onTrimMemory(int)并从那里清除单例。