我需要停止周期性的 GcmTaskServices 吗?

Do I need to stop periodic GcmTaskServices?

我正在尝试使用 GcmNetworkManager API(从 Google Play Services 7.5 开始存在)实现 PeriodicTask

我的任务在我的应用程序启动后立即安排,并将检查 Queue 个对象的内容,以便将它们作为批次发送到我的服务器。 如果队列为空,方法 onRunTask() 几乎什么都不做(它将检查队列和 return GcmNetworkManager.RESULT_SUCCESS)。


我在实现中放置了一些日志,并注意到 PeriodicTask 会永远保持 运行,即使我的应用程序处于后台或从内存中删除后也是如此。

这让我担心用户的电池。即使我不会执行任何繁重的任务或 HTTP 请求,该过程也会在没有真正需要的情况下定期启动。

起初,我认为 GcmNetworkManager 以指数方式后退我的 Task 直到它停止(或者我可能做错了什么阻止了它)是明智的,但是,作为我的日志显示,这并没有发生。

之后,我尝试使用 cancelTask()cancelAll(),但如果从 TaskonRunTask() 方法本身调用它们,它们将不起作用。即使调用 stopSelf() 也不是一个好主意,因为 GcmNetworkManager 负责 Service 生命周期,所以我不想妨碍。

实际完成任务的难度让我思考这是否是正确的方法(也许我应该让 Task 永远活着?)。


如何在不耗尽用户电池的情况下正确使用 PeriodicTask

首先,你真的需要周期性的任务执行吗?听起来你可以用 updateCurrent whenever you update your Queue. In case of upload failure, you can use RESULT_RESCHEDULE 注册 OneoffTask 稍后重试(Google Play 服务将采用指数退避策略来决定何时重试)。

我不知道你的要求,所以你可能真的需要 PeriodicTask。如果是这样,您不必太担心电池。 GcmNetworkManager 的想法是,让 Google Play 服务处理任务执行,因此它可以同时执行多个任务。

Phone 将其状态从非活动状态更改为活动状态时会消耗电池(例如,请参阅 https://www.youtube.com/watch?v=-3ry8PxcJJA) so as long as your job is executed in batch with other tasks and finishes your job immediately, you don't waste much power. You can configure executionWindow 以鼓励批处理。