Android活动和服务生命周期中的单例

Android活动和服务生命周期中的单例,android,Android,我试图使用一个静态单例数据管理器,它为我的活动发出网络请求并保存数据数组,在我的活动的onCreate()类中进行实例化,但每次方向发生变化时活动都会被破坏的想法让我大吃一惊。我不想每次用户改变方向或返回屏幕时都重新创建一个新的singleton并用数据重新填充它 即使我将DataManager设置为一个服务,如果我将其设置为绑定服务,则每当我的活动被销毁时,该服务似乎都会被销毁,但如果我不将其设置为绑定服务,并在我的活动中使用startService()和stopService(),则每当我的

我试图使用一个静态单例数据管理器,它为我的活动发出网络请求并保存数据数组,在我的活动的
onCreate()
类中进行实例化,但每次方向发生变化时活动都会被破坏的想法让我大吃一惊。我不想每次用户改变方向或返回屏幕时都重新创建一个新的singleton并用数据重新填充它

即使我将DataManager设置为一个服务,如果我将其设置为绑定服务,则每当我的活动被销毁时,该服务似乎都会被销毁,但如果我不将其设置为绑定服务,并在我的活动中使用
startService()
stopService()
,则每当我的活动被销毁时,该服务也会被销毁

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


我已经读到,我不应该将应用程序子类化以维护应用程序状态,但我不明白它如何以任何其他方式工作。感谢您的澄清。

对应用程序类进行子类化,然后在application.onCreate()回调中实例化您的单例。这样,它将在应用程序的生命周期内可用,而不是在单个活动的生命周期内可用。小心,在有人杀死你的应用程序之前,不会对其进行垃圾收集,这样就不会有太多的“全局”单例。

对应用程序类进行子类化,然后在application.onCreate()回调中实例化你的单例。这样,它将在应用程序的生命周期内可用,而不是在单个活动的生命周期内可用。请注意,在有人杀死你的应用程序之前,不会对其进行垃圾收集,这样就不会有太多的“全局”单例。

不要在
应用程序中执行此工作。onCreate()
。无论发生什么情况,您都会减慢应用程序的启动速度。对于Android应用程序,不建议这样做,因为您希望您的应用程序能够迅速启动

相反,如果你真的需要一个单例,在必要时让它惰性地构造(如果你确定你会使用它,你也可以在你的活动开始时从一个单独的线程异步地强制构造)。当你的活动被破坏时,并不意味着整个过程会立即被破坏,所以你的单身汉会活下来


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

不要在
应用程序中执行该工作。onCreate()
。无论发生什么情况,您都会减慢应用程序的启动速度。对于Android应用程序,不建议这样做,因为您希望您的应用程序能够迅速启动

相反,如果你真的需要一个单例,在必要时让它惰性地构造(如果你确定你会使用它,你也可以在你的活动开始时从一个单独的线程异步地强制构造)。当你的活动被破坏时,并不意味着整个过程会立即被破坏,所以你的单身汉会活下来


此外,如果您正在使用单例,请确保在内存不足时能够清除它。您需要从那里实现并清除singleton。

请记住,如果框架在您的上一个活动退出后保留流程,则
应用程序
实例也将保留,并且下次启动应用程序时,相同的实例将被重用,而无需再次调用
onCreate()
。我的理解是,如果应用程序被终止,并且使用不再有效的指针还原活动,这可能会有问题并导致NullPointerException:。以下是最佳做法的讨论(而不是在此重复)@newt如果进程被终止,将重新创建
应用程序
,因此,在其
onCreate()
中初始化的任何内容都将被重新初始化。当活动使用
应用程序
作为数据传递给其他活动的持有者时,就会出现问题。如果应用程序被终止,则可以恢复活动堆栈,但
应用程序中的值将不存在。@newt Right。如果进程需要内存,操作系统将终止进程,因此您不必太担心单例中的数据。只需确保它们只包含数据,而不包含后台线程。请记住,如果框架在您上次活动退出后保留流程,则
应用程序
实例也将保留,并且在您下次启动应用程序时将重复使用同一实例,而无需再次调用
onCreate()
。我的理解是,如果应用程序被终止,并且使用不再有效的指针还原活动,这可能会有问题并导致NullPointerException:。以下是最佳做法的讨论(而不是在此重复)@newt如果进程被终止,将重新创建
应用程序
,因此,在其
onCreate()
中初始化的任何内容都将被重新初始化。当活动使用
应用程序
作为数据传递给其他活动的持有者时,就会出现问题。如果应用程序被终止,则可以恢复活动堆栈,但
应用程序中的值将不存在。@newt Right。如果进程需要内存,操作系统将终止进程,因此您不必太担心单例中的数据。只需确保它们只包含数据,而不包含backg