我试图围绕GcmNetworkManager工具中的setTag和OneoffTask的setUpdateCurrent的行为.
setUpdateCurrent的文档说明了这一点:
可选的setter,用于指定此任务是否应覆盖具有相同标记的任何预先存在的任务.默认为false,这意味着新任务不会覆盖现有任务.
很公平,但它并没有说明任务会发生什么,它只说一件事不会发生 - 即任务不会被覆盖.:)我不清楚是否使用setUpdateCurrent意味着允许重复任务意味着它们被丢弃?
为了清楚起见,我的问题是:假设您使用了setUpdateCurrent(false),当您创建一个OneoffTask,其标签与已经安排的另一个OneoffTask相同时,除了已经安排的任务之外,新任务是否仍会发生,或者新任务是否会被抛弃,被视为重复?
鉴于您使用了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)
一个任务也保持计划,但正如预期的那样,它将是新任务.
最后,如果您指定具有不同标记的任务并安排它们,则任务计数将变为两个,并且两个任务都将处于挂起状态,这也是预期的.