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

我的应用程序启动后便安排了我的任务,该任务将检查对象Queue的内容,以便将它们批量发送到我的服务器。
如果队列为空,方法onRunTask()将几乎不执行任何操作(它将检查队列和return GcmNetworkManager.RESULT_SUCCESS)。



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

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

起初,我认为GcmNetworkManager会以指数方式退回Task直到停止(或者也许我做错了阻止它的事情)是明智的,但是,正如我的日志所示,这没有发生。

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

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



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

最佳答案

首先,您是否真的需要定期执行任务?听起来好像每次更新队列时都可以向updateCurrent注册OneoffTask。万一上传失败,您可以稍后使用RESULT_RESCHEDULE重试(Google Play服务将采用指数补偿策略来决定何时重试)。

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

手机将其状态从不活动状态更改为活动状态时(例如,请参见https://www.youtube.com/watch?v=-3ry8PxcJJA)会消耗电池电量,因此只要您的工作与其他任务一起批量执行并立即完成工作,就不会浪费很多电量。您可以配置executionWindow鼓励批量处理。

10-06 10:47