我是否需要定期停止GcmTaskServices?

时间:2015-11-26 18:35:38

标签: android google-cloud-messaging google-play-services

我尝试使用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

1 个答案:

答案 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以鼓励批处理。