澄清 OneOffTask 上的 setUpdateCurrent

Clarification of setUpdateCurrent on OneOffTask

我正在努力研究 GcmNetworkManager 工具中 OneoffTask 的 setTag 和 setUpdateCurrent 的行为。
The documentation of setUpdateCurrent 是这样说的:

Optional setter to specify whether this task should override any preexisting tasks with the same tag. This defaults to false, which means that a new task will not override an existing one.

很公平,但它没有说明任务会发生什么,它只说明了一件 不会 发生的事情 - 即任务不会被覆盖。 :) 我不清楚使用 setUpdateCurrent 是否意味着允许重复任务,或者是否意味着它们被丢弃?

明确地说,我的问题是: 鉴于您使用了 setUpdateCurrent(false),当您创建一个与另一个已安排的 OneoffTask 具有相同标签的 OneoffTask 时,除了已经安排的任务之外,新任务是否还会发生,或者新任务是否会被丢弃,作为重复任务被驳回?

Given that you used setUpdateCurrent(false), when you create a OneoffTask with the same tag as another OneoffTask that is already scheduled, will the new task still happen in addition to the already scheduled one, or will the new task be thrown away, dismissed as a duplicate?

新任务被丢弃并且永远不会被安排。我对此感到惊讶,并且绝对觉得文档应该如此说明。

事实证明,您可以使用以下命令自行测试:

adb shell dumpsys activity service GcmService --endpoints YourGcmTaskServiceClassName

这使您可以查看有多少待处理的任务等。在您的代码中调用 GcmNetworkManager.getInstance(this).schedule(task) 之后,您打包的任务数将在 adb 命令的输出中立即增加:

Tasks count by package:
com.mypackage: 1

下方是显示待处理任务的区域:

Pending:

(scheduled) endpoint='com.mypackage/com.mypackage.YourGcmTaskServiceClassName'
tag='testing' : [PENDING] u0
Next execution: [early=17s, expires=37s]
Not yet run.

现在,如果您尝试使用 setUpdateCurrent(false) 和与当前未决任务相同的标签安排另一项任务,您将在下次 运行 adb 命令时注意到只有一项任务仍然存在待定,这是您安排的第一个任务。

如果您指定 setUpdateCurrent(true) 一项任务也会保持计划状态,但正如预期的那样它将成为新任务。

最后,如果您指定具有不同标签的任务并安排它们,则任务计数将变为两个,并且两个任务都将处于待处理状态,这也是预期的。