在这里,我想问一个基本问题,我无法找到答案,而我做代码。Android:Singleton实例与服务
据我所知,在应用程序onCreate()中创建一个单例实例比android服务具有更小的脆弱性。在我的应用程序中,我想倾听位置更新,该位置更新应该不太可能被破坏。如果我保持服务,它可能会在低内存中被杀死,但仍然可以在后台运行应用程序,以保持实例。所以我想用单例实例而不是服务。
这是一个正确的方法吗?
在这里,我想问一个基本问题,我无法找到答案,而我做代码。Android:Singleton实例与服务
据我所知,在应用程序onCreate()中创建一个单例实例比android服务具有更小的脆弱性。在我的应用程序中,我想倾听位置更新,该位置更新应该不太可能被破坏。如果我保持服务,它可能会在低内存中被杀死,但仍然可以在后台运行应用程序,以保持实例。所以我想用单例实例而不是服务。
这是一个正确的方法吗?
如果你问我的意见,我不会推荐。因为两者在后台吸取用户的电池。
我会做的是 - 只在主要活动的前景获取位置更新。同时开始使用Google Play服务FusedLocationProvider,而不是实现Android默认的一个。
当你的应用程序变为背景时删除位置更新。所有的指导方针都在android开发人员网站上。
https://developer.android.com/training/location/receive-location-updates.html
但是在我的应用程序中,即使应用程序在后台,我也想要听位置更新。我知道电池是主要问题,但对我的应用程序来说可以忽略不计。 – sd33din90
最好的做法是在Application
类创建Singleton实例。
因此,它将可用,而Service
或Activity
存在。
也可以使用Foreground Service
,如果检测到低内存,它不会被终止。
此外,您还可以处理Application类中的低内存事件或Service中的onDestroy,并将数据序列化为SharedPreferences。 START_STICKY服务将尽快重新启动。
我认为你的问题在于维护组件24到365,以便管理位置。
您可以通过管理onStartCommand中的返回标志来维护您的服务以防止它被重新启动。 START_STICKY等。
读出更多的位置: https://developer.android.com/reference/android/app/Service.html#START_STICKY
根据您的描述,我建议采取前景服务。跟踪用户的位置使用了很多batterie。因此,您的用户应始终注意您的应用程序仍在运行的事实。
你也在阻止系统以这种方式杀死你的应用程序。
前台服务是用户主动意识到 ,是不是系统杀死时内存不足的候选者的服务 Source
的Android可以(而且会)终止后台在低资源情况下进行处理,有时也仅仅是因为它想要(特别是在低端设备上以节省电池和内存资源)。它通过来完成这一操作,从而阻止托管您的应用程序的操作系统进程。在这种情况下,您的应用将不再在后台运行,因此您在Application.onCreate()
中创建的任何单身也将消失。
Android完全不了解你的单身,因此没有理由恢复它。
但是,如果你创建一个Service
和Service
返回START_STICKY
从onStartCommand()
,这告诉Android你Service
要保持运行所有的时间(如果可能)。在这种情况下,如果Android杀死承载您的Service
的操作系统进程(由于资源限制或仅仅因为它想),Android会自动重新启动您的Service
(因为Android知道您的Service
并知道它想运行所有时间)。这是做到这一点的正确方法。
注意:有一些设备(特别是像小米,华为,LG,联想等中国设备)不会自动重启STICKY服务。这些设备维护允许在后台运行的“受保护的应用程序”或“特权应用程序”的列表,并且Android只会为列表中的应用程序重新启动STICKY服务。您需要让用户手动将您的应用添加到此列表。无法以编程方式将您的应用程序添加到这些设备上的此列表。
见https://stackoverflow.com/a/42120277/769265和 https://stackoverflow.com/a/41369032/769265
单被立即杀死了你的活动被摧毁后,我宁愿留在服务 – mayosk
@mayosk会这样呢?即使我创造了单一实例,我也不认为它会被杀死。但无论如何,我想创建它的应用程序onCreate()只。 – sd33din90
做一个测试,在你的单身人士创建方法中,每分钟都会记录一些东西,尝试一下你的应用程序是否可见,然后去应用程序并检查 – mayosk