GcmNetworkManager定期任务处理

4
我需要安排一个每24小时运行一次的任务,从远程服务器获取一些小数据。由于我需要支持sdk 15+(JobScheduler仅支持21+),因此GcmNetworkManager似乎是一个完美的选择。
我通过扩展Application的onCreate方法实现这一点。我使用特定标签创建一个PeriodicTask,并调用.setUpdateCurrent(false)(因此第一个任务会被安排,随后的任务应该被忽略,因为它们不应更新现有任务)。
在文档中,我读到:

重要提示:当Google Play服务或客户端应用程序更新时,所有已安排的任务都将被删除。GcmNetworkManager会调用客户端应用程序的onInitializeTasks()函数。重写此函数以重新安排必要的任务。

在我的情况下,由于我总是在Application的onCreate方法中创建更新任务,这并不重要。有没有比我正在做的更好的方法?(另外,我希望有一种方法可以检查是否存在具有给定标签的待处理周期性任务)。

只是一个快速的问题:您能指出需要使用SDK 15+的GcmNetworkManager方法(或文档)吗?我在一个应用程序中使用它,否则只需要SDK级别5,并且尚未找到更改此内容的原因。但是我可能错过了什么!如果我错过了,请告诉我!这很重要... :) - Markus A.
1个回答

4

除非你在一个广播接收器中监听 ACTION_MY_PACKAGE_REPLACED 并在那里安排你的任务,否则你仍应该重写 onInitializeTasks() 来创建相同的 PeriodicTask。否则,在应用程序被 Google Play 商店更新和用户手动运行之间可能存在时间差,此时你没有周期性任务被安排。


谢谢Ian,根据文档,onInitializeTasks()在应用程序首次安装时不会被调用,只有在更新后才会被调用。话虽如此,我将有重复的代码设置任务并跟踪需要重新安排的任务。有更好的方法吗?另外,如果我从该作业返回“RESULT_RESCHEDULE”,那么PerodicTask如何重新安排?它是否遵循标准指南,在尝试x次和2x.. 3X之后放弃?周期性工作在出错时返回RESULT_RESCHEDULE是否有意义? - bond
你说得好像你的 onIntializeTasks() 和 Application 的 onCreate() 不能共享同一组代码(一个接受 Context 的静态方法就足够了)。不同的结果对 PeriodicTask 影响良好(实际上,RESULT_FAILURE 只在停止尝试直到下一次计划同步时才有意义)。如果你有暂时的错误,你希望它们自己清除 - 这将是指数退避的完美案例。 - ianhanniballake
只是为了澄清,即使我使用 setPersisted 来构建一个周期性任务,我仍然需要使用 onInitializeTasks() 进行重新调度吗?我认为如果 PeriodicTask 已持久化,我就不需要再次进行调度了吧?(注意:我还在 Application.onCrate 中使用 updateCurrent=false 来安排 PreodicTask,因为我只想要一个活动任务) - bond
1
根据setPersisted()文档setPersisted()仅涉及在重新启动后持久化,没有其他作用。 - ianhanniballake
GcmNetworkManager 依赖于 GPServices。您需要检查设备上 GPS 的可用性(在此 Google 示例中使用“checkPlayServicesAvailable”方法 https://goo.gl/VlHn1K)。以前建议在主活动的 onResume() 方法中检查 GPServices(以前在此处 https://goo.gl/JqfX9q)。我的第一种方法是在 Application onCreate 中进行检查,但现在我在 MainActivity 上安排任务,在检查 Google Play Services 的可用性后,并在 onInitializeTasks() 方法上覆盖任务。我不确定这是否是最佳方法。 - Sotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接