澄清OneOffTask上的setUpdateCurrent

时间:2015-12-30 11:46:06

标签: android google-cloud-messaging android-service android-jobscheduler

我正试图围绕GcmNetworkManager工具中的setTag和OneoffTask的setUpdateCurrent的行为。
The documentation of setUpdateCurrent说:

  

可选的setter,用于指定此任务是否应覆盖具有相同标记的任何预先存在的任务。默认为false,这意味着新任务不会覆盖现有任务。

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

要明确,我的问题是这样的:鉴于你使用了setUpdateCurrent(false),当你创建一个OneoffTask,其标签与已经安排的另一个OneoffTask相同时,新任务仍然是除了已经安排的那个之外发生了什么,或者新任务是否会被丢弃,被视为重复?

1 个答案:

答案 0 :(得分:9)

  

假设您使用了setUpdateCurrent(false),则在创建时使用   OneoffTask与另一个OneoffTask具有相同的标签   预定,除了已经完成的新任务还会发生   预定的一个,或将新的任务扔掉,被解雇为   重复?

新任务被丢弃,从未安排过。我对此感到惊讶,并且肯定觉得文档应该如此说明。

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

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),一个任务也会保持计划,但正如预期的那样,它将成为新任务。

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