在后台服务中使用 GoogleAPIClient

Using GoogleAPIClient in Background Services

我的场景是我希望有一个服务定期获取一些信息(例如用户的位置),将其报告到我的服务器并在该位置与某个 X 位置匹配时接收推送通知。

我想就定期检索位置信息的最佳机制提出一些建议,无论应用程序是否 运行。以下是我考虑过的选项以及每个选项的一些背景信息。

创建标准 Android 服务

我的第一个想法是创建一个 STICKY 服务,该服务初始化一个 GoogleAPIClient,它将获取位置更新,一旦收到位置,它就会将其发送到服务器。这种方法的问题是我必须定期获取位置信息。因此,即使不是 运行 位置扫描,该服务也会一直 运行。另外,在服务中经常轮询位置的最佳方式是什么?

使用 IntentService 创建警报

我考虑的第二个选项是让警报管理器唤醒并启动一个 IntentService 来启动位置更新(通过 GoogleAPIClient)。获得位置后,发送到服务器并关闭位置更新。这将解决定期 starting/stoping 位置更新的问题。但是,我在不等待的情况下连接到 IntentService 中的 GoogleAPIClient 的运气并不好,我认为这不是最有效的做法。

创建 GcmTaskService

这具有 AlarmManager 的许多优点,并且在打瞌睡模式方面似乎更有效,因为它仅在 phone 处于维护模式时才唤醒服务,因此这似乎是一个很好的解决方案。但是,我遇到了与连接到 GoogleAPIClient 的 IntentService 相同的问题,无需某种等待即可获取位置。

我可能在这个问题上走得太远了,我可能遗漏了一些明显的东西,所以任何建议都将不胜感激。

当您请求更新时,您可以请求最大频率。只需使用一项服务并将最大频率设置为您想要的轮询间隔。不需要 AlarmManager。

我有同样的问题。我选择了第一种方法(粘性服务)并且一切正常。但是,我不喜欢该服务始终 运行 并且对用户可见的事实。 这就是我决定使用 JobScheduler API 的原因,因为它是根据 docs.

执行后台工作的首选方式

如果您的应用面向 API>=21,那么 JobScheduler 是最佳选择。如果你想支持旧版本的平台,那么你应该使用最近引入的 Firebase JobDispatcher 库,遗憾的是它缺少文档。

在 Google I/O 2016 年的演讲中 here 解释了一切。看看吧。