我尝试使用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
?
答案 0 :(得分:1)
首先,你真的需要定期执行任务吗?听起来您可以在更新队列时向OneoffTask
注册PeriodicTask
。如果上传失败,您可以使用updateCurrent稍后重试(Google Play服务将采用指数退避策略来决定何时重试)。
我不知道你的要求,所以你可能真的需要GcmNetworkManager
。如果是这样,你不必太担心电池。 {"token": "e2a9b561fc24a65b607135857d304747a36d0e8d"}
curl -X GET http://<ip:port>/trainer/logToken/ -H "Authorization: Token e2a9b561fc24a65b607135857d304747a36d0e8d"
的想法是,让Google Play服务处理任务执行,以便它可以一起执行多个任务。
电话在将状态从非活动状态更改为活动状态时会消耗电量(参见例如RESULT_RESCHEDULE),因此只要您的工作与其他任务分批执行并立即完成工作,您就不会浪费很有力量。您可以配置https://www.youtube.com/watch?v=-3ry8PxcJJA以鼓励批处理。