2017-03-17 98 views
1

在这里,我想问一个基本问题,我无法找到答案,而我做代码。Android:Singleton实例与服务

据我所知,在应用程序onCreate()中创建一个单例实例比android服务具有更小的脆弱性。在我的应用程序中,我想倾听位置更新,该位置更新应该不太可能被破坏。如果我保持服务,它可能会在低内存中被杀死,但仍然可以在后台运行应用程序,以保持实例。所以我想用单例实例而不是服务。

这是一个正确的方法吗?

+0

单被立即杀死了你的活动被摧毁后,我宁愿留在服务 – mayosk

+0

@mayosk会这样呢?即使我创造了单一实例,我也不认为它会被杀死。但无论如何,我想创建它的应用程序onCreate()只。 – sd33din90

+0

做一个测试,在你的单身人士创建方法中,每分钟都会记录一些东西,尝试一下你的应用程序是否可见,然后去应用程序并检查 – mayosk

回答

0

如果你问我的意见,我不会推荐。因为两者在后台吸取用户的电池。

我会做的是 - 只在主要活动的前景获取位置更新。同时开始使用Google Play服务FusedLocationProvider,而不是实现Android默认的一个。

当你的应用程序变为背景时删除位置更新。所有的指导方针都在android开发人员网站上。

https://developer.android.com/training/location/receive-location-updates.html

+0

但是在我的应用程序中,即使应用程序在后台,我也想要听位置更新。我知道电池是主要问题,但对我的应用程序来说可以忽略不计。 – sd33din90

0

最好的做法是在Application类创建Singleton实例。

因此,它将可用,而ServiceActivity存在。

也可以使用Foreground Service,如果检测到低内存,它不会被终止。

此外,您还可以处理Application类中的低内存事件或Service中的onDestroy,并将数据序列化为SharedPreferences。 START_STICKY服务将尽快重新启动。

0

我认为你的问题在于维护组件24到365,以便管理位置。

您可以通过管理onStartCommand中的返回标志来维护您的服务以防止它被重新启动。 START_STICKY等。

读出更多的位置: https://developer.android.com/reference/android/app/Service.html#START_STICKY

+0

如果应用程序在低内存中运行,粘滞服务也会被破坏,但应用程序仍有可能运行。 – sd33din90

+0

它将由Android重新启动..您还可以使用重新传送意图获取数据... – Ishant

0

根据您的描述,我建议采取前景服务。跟踪用户的位置使用了很多batterie。因此,您的用户应始终注意您的应用程序仍在运行的事实。

你也在阻止系统以这种方式杀死你的应用程序。

前台服务是用户主动意识到 ,是不是系统杀死时内存不足的候选者的服务 Source

3

的Android可以(而且会)终止后台在低资源情况下进行处理,有时也仅仅是因为它想要(特别是在低端设备上以节省电池和内存资源)。它通过来完成这一操作,从而阻止托管您的应用程序的操作系统进程。在这种情况下,您的应用将不再在后台运行,因此您在Application.onCreate()中创建的任何单身也将消失。

Android完全不了解你的单身,因此没有理由恢复它。

但是,如果你创建一个ServiceService返回START_STICKYonStartCommand(),这告诉Android你Service要保持运行所有的时间(如果可能)。在这种情况下,如果Android杀死承载您的Service的操作系统进程(由于资源限制或仅仅因为它想),Android会自动重新启动您的Service(因为Android知道您的Service并知道它想运行所有时间)。这是做到这一点的正确方法。

注意:有一些设备(特别是像小米,华为,LG,联想等中国设备)不会自动重启STICKY服务。这些设备维护允许在后台运行的“受保护的应用程序”或“特权应用程序”的列表,并且Android只会为列表中的应用程序重新启动STICKY服务。您需要让用户手动将您的应用添加到此列表。无法以编程方式将您的应用程序添加到这些设备上的此列表。

https://stackoverflow.com/a/42120277/769265https://stackoverflow.com/a/41369032/769265