前景服务与WorkManager进行位置跟踪

问题描述

假设我要构建一个应用程序,该应用程序会定期请求当前位置(例如,每10分钟,此数字应可配置)并提交给服务器。

我知道通常针对这种情况建议使用Foreground Service和WorkManager。但是,哪个更合适?以下是我的想法和疑问。

  1. WorkManager-主要用于保证执行的可延期后台工作。但是,我知道从Android 8(API 26)开始引入了后台位置,并且该位置限制每小时每小时仅更新几次https://developer.android.com/about/versions/oreo/background-location-limits。因此,这可能不符合要求的定期更新。

  2. ForegroundService-非常适合运行并且需要让用户注意的东西。建议出于隐私目的在这种情况下(位置跟踪)使用。 Google还创建了一个示例应用程序来推广这种做法https://github.com/android/location-samples/tree/master/LocationUpdatesForegroundService

根据以上分析,似乎ForegroundService一个。但是,我还发现WorkManager具有内置支持,可通过ForegroundService https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running-kotlin

将Worker与androidx.work.impl.foreground.SystemForegroundService结合使用

这让我感到困惑,在这种情况下应该使用什么以及Google真正推荐的东西。

有人知道吗?

解决方法

如果您想通过某种方式与服务进行通信,请使用前台服务,并且如果您希望基于在该工作管理器中所做的其他事情得到一些处理后的输入,请选择工作管理器。

工作管理器没有选项来重新传达意图和所有其他命令,例如启动粘滞等...

因为工作管理器更适合与db同步数据,处理文件等。

如果您要问我,我会选择前台服务,因为您可以在清单中注册xml标记时将其添加到类型位置。

这两种解决方案都不能幸免于OEM严格的电池限制,因为WorkManager的工作可以推迟,并且如果我想将即时执行与唤醒锁结合使用,那么我可以在前台服务中轻松地完成它,因为它还有一个绑定器选项,可以很好地工作用于UI同步。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...