我正在尝试使用PeriodicTask
API(自GcmNetworkManager
开始存在)实现Google Play Services 7.5
。
我的应用程序启动后便安排了我的任务,该任务将检查对象Queue
的内容,以便将它们批量发送到我的服务器。
如果队列为空,方法onRunTask()
将几乎不执行任何操作(它将检查队列和return GcmNetworkManager.RESULT_SUCCESS
)。
我在实现中放入了一些日志,并注意到PeriodicTask
永远保持运行,即使我的应用程序处于后台或已从内存中删除之后也是如此。
这使我担心用户的电池电量。即使我不会执行任何繁重的任务或HTTP请求,该过程也会在没有真正需要的情况下定期启动。
起初,我认为GcmNetworkManager
会以指数方式退回Task
直到停止(或者也许我做错了阻止它的事情)是明智的,但是,正如我的日志所示,这没有发生。
之后,我尝试使用cancelTask()
和cancelAll()
,但是如果从Task
的onRunTask()
方法本身调用,它们将不起作用。甚至调用stopSelf()
也不是一个好主意,因为GcmNetworkManager
是负责Service
生命周期的人员,因此我不想妨碍您。
实际完成任务的困难使我思考这是否是正确的方法(也许我应该让Task
永远存在?)。
如何在不耗尽用户电池电量的情况下正确使用PeriodicTask
?
最佳答案
首先,您是否真的需要定期执行任务?听起来好像每次更新队列时都可以向updateCurrent注册OneoffTask
。万一上传失败,您可以稍后使用RESULT_RESCHEDULE重试(Google Play服务将采用指数补偿策略来决定何时重试)。
我不知道您的要求,因此您可能真的需要PeriodicTask
。如果是这样,您不必太担心电池。 GcmNetworkManager
的想法是,您可以让Google Play服务处理任务执行,以便它可以一起执行多个任务。
手机将其状态从不活动状态更改为活动状态时(例如,请参见https://www.youtube.com/watch?v=-3ry8PxcJJA)会消耗电池电量,因此只要您的工作与其他任务一起批量执行并立即完成工作,就不会浪费很多电量。您可以配置executionWindow鼓励批量处理。