Android:单例实例与服务
Android: Singleton Instance vs Service
在这里我想问一个我在写代码时找不到答案的基本问题
据我了解,在应用程序 onCreate() 中创建单例实例比 android 服务更不容易受到攻击。在我的应用程序中,我想监听应该不太可能被破坏的位置更新。如果我继续服务,它可能会在内存不足的情况下被杀死,但应用程序可以在后台 运行 保留实例。所以我想使用单例实例而不是服务。
这是正确的做法吗?
如果你问我的意见,我也不会推荐。因为两者都在后台吸用户的电池。
我会做的是 - 仅在主 activity 的前台获取位置更新。也开始使用 Google 播放服务 FusedLocationProvider 而不是实施 android 默认值。
当您的应用进入后台时删除位置更新。所有指南都在 android 开发者网站上。
https://developer.android.com/training/location/receive-location-updates.html
最佳做法是在 Application
class.
中创建 Singleton 实例
所以当 Service
或 Activity
存在时它将可用。
您也可以使用 Foreground Service
,如果检测到内存不足,它不会被杀死。
您还可以在 Application class 或 Service 中的 onDestroy 中处理低内存事件,并将数据序列化到 SharedPreferences。使用 START_STICKY 服务将尽快重新启动。
我认为您的问题在于维护组件 24 x 7 x 365 以便管理位置。
您可以通过管理 onStartCommand 的返回标志来维护您的服务以在服务被破坏的情况下再次启动。 START_STICKY 等..
在此处阅读更多内容:
https://developer.android.com/reference/android/app/Service.html#START_STICKY
根据您的描述,我建议采用 Foreground-Service。跟踪用户位置会消耗大量电池。因此,您的用户应该始终意识到您的应用仍在运行并且 运行。
您还阻止系统以这种方式终止您的应用程序。
A foreground service is a service that the user is actively aware of
and is not a candidate for the system to kill when low on memory
Source
Android 可以(并且将会)在资源不足的情况下终止后台进程,有时只是因为它想要(特别是在低端设备上以节省电池和内存资源)。它通过 终止托管您的应用程序 OS 进程 来实现。在这种情况下,您的应用将不再 运行 在后台运行,因此您在 Application.onCreate()
中创建的任何单例也将消失。
Android 对您的单例一无所知,因此没有理由恢复它。
但是,如果您从 onStartCommand()
创建 Service
和 Service
returns START_STICKY
,这会告诉 Android 您的 Service
想一直保持 运行ning(如果可能的话)。在这种情况下,如果 Android 终止了托管您的 Service
的 OS 进程(由于资源限制,或者只是因为它想要这样做),Android 将自动重启您的 Service
(因为 Android 知道你的 Service
并且知道它一直想要 运行)。这是执行此操作的正确方法。
注意:有些设备(尤其是中国设备,如小米,还有华为、LG、联想等)不会自动重启 STICKY 服务。这些设备维护一个 "protected apps" 或 "priviledged apps" 的列表,允许在后台 运行 并且 Android 只会为该列表中的应用程序重新启动 STICKY 服务。您需要让您的用户手动将您的应用程序添加到此列表。无法以编程方式将您的应用程序添加到这些设备上的此列表中。
参见 和
在这里我想问一个我在写代码时找不到答案的基本问题
据我了解,在应用程序 onCreate() 中创建单例实例比 android 服务更不容易受到攻击。在我的应用程序中,我想监听应该不太可能被破坏的位置更新。如果我继续服务,它可能会在内存不足的情况下被杀死,但应用程序可以在后台 运行 保留实例。所以我想使用单例实例而不是服务。
这是正确的做法吗?
如果你问我的意见,我也不会推荐。因为两者都在后台吸用户的电池。
我会做的是 - 仅在主 activity 的前台获取位置更新。也开始使用 Google 播放服务 FusedLocationProvider 而不是实施 android 默认值。
当您的应用进入后台时删除位置更新。所有指南都在 android 开发者网站上。
https://developer.android.com/training/location/receive-location-updates.html
最佳做法是在 Application
class.
所以当 Service
或 Activity
存在时它将可用。
您也可以使用 Foreground Service
,如果检测到内存不足,它不会被杀死。
您还可以在 Application class 或 Service 中的 onDestroy 中处理低内存事件,并将数据序列化到 SharedPreferences。使用 START_STICKY 服务将尽快重新启动。
我认为您的问题在于维护组件 24 x 7 x 365 以便管理位置。
您可以通过管理 onStartCommand 的返回标志来维护您的服务以在服务被破坏的情况下再次启动。 START_STICKY 等..
在此处阅读更多内容: https://developer.android.com/reference/android/app/Service.html#START_STICKY
根据您的描述,我建议采用 Foreground-Service。跟踪用户位置会消耗大量电池。因此,您的用户应该始终意识到您的应用仍在运行并且 运行。
您还阻止系统以这种方式终止您的应用程序。
A foreground service is a service that the user is actively aware of and is not a candidate for the system to kill when low on memory Source
Android 可以(并且将会)在资源不足的情况下终止后台进程,有时只是因为它想要(特别是在低端设备上以节省电池和内存资源)。它通过 终止托管您的应用程序 OS 进程 来实现。在这种情况下,您的应用将不再 运行 在后台运行,因此您在 Application.onCreate()
中创建的任何单例也将消失。
Android 对您的单例一无所知,因此没有理由恢复它。
但是,如果您从 onStartCommand()
创建 Service
和 Service
returns START_STICKY
,这会告诉 Android 您的 Service
想一直保持 运行ning(如果可能的话)。在这种情况下,如果 Android 终止了托管您的 Service
的 OS 进程(由于资源限制,或者只是因为它想要这样做),Android 将自动重启您的 Service
(因为 Android 知道你的 Service
并且知道它一直想要 运行)。这是执行此操作的正确方法。
注意:有些设备(尤其是中国设备,如小米,还有华为、LG、联想等)不会自动重启 STICKY 服务。这些设备维护一个 "protected apps" 或 "priviledged apps" 的列表,允许在后台 运行 并且 Android 只会为该列表中的应用程序重新启动 STICKY 服务。您需要让您的用户手动将您的应用程序添加到此列表。无法以编程方式将您的应用程序添加到这些设备上的此列表中。
参见