关于GcmTaskService的一些问题

时间:2015-07-15 09:07:49

标签: android android-5.0-lollipop android-jobscheduler gcmtaskservice

背景

我想使用Lollipop上提供的新JobScheduler API,但遗憾的是它没有用于棒棒糖前的官方端口。

但是,有GcmTaskService,它提供了非常相似的功能。

问题

此API非常新,因此很少有地方可以查找有关如何使用它的信息(例如herehere)。

问题

我对这个新API有几个问题:

  1. 似乎需要使用Google Play服务(here)(使用Lollipop版Android时除外,它将使用普通的JobScheduler)。如果Google Play服务不可用,我该怎么办?

  2. 似乎即使我为重复任务使用了“setPersisted(true)”,当我重新启动设备时,也不会再次调用该任务。怎么会? 编辑:那是因为我错过了RECEIVE_BOOT_COMPLETED的许可。

  3. 如果我不使用“setRequiredNetwork”,任务的默认行为是什么?是“NETWORK_STATE_ANY”吗?

  4. docs说明从onRunTask返回的内容,我可以返回任何值“RESULT_FAILURE”,“RESULT_RESCHEDULE”,“RESULT_SUCCESS”(info here)。似乎FAILURE和SUCCESS选项都会做同样的事情 - 从队列中删除任务。这是真的吗?如果是这样,它们之间究竟有什么区别?它们的功能有何不同?

  5. TaskParams”是否仅用于任务的代码?我可以以某种方式使用API​​将包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吗?

  6. 应用程序是否可以获取任务的队列?我知道可以使用adb,但也可以使用API​​吗?

  7. 他们说(here)每个任务都有一个长达3分钟的唤醒锁。如果任务需要更多,应该怎么做?它应该为自己获得另一个唤醒锁吗? API是否会警告唤醒锁被释放?以下是文档的说法:

  8.   

    调度程序将为您的服务保留一个PowerManager.WakeLock,   但是,如果你的任务没有返回,执行三分钟后   它会被认为已经超时了,而唤醒者将是   释放。此时重新安排任务将不起作用。如果   你怀疑你的任务会比这更长,你应该开始你的任务   明确拥有服务或使用其他机制;这个API是   旨在用于相对快速的网络运营。

    1. 他们说(here)每次应用程序升级/替换时都会删除所有网络任务,并且在发生这种情况时会调用“onInitializeTasks”,并且您可以重新安排他们再次。我该如何重新安排任务?我认为我甚至无法获得任务清单......

    2. 是否有可能告诉任务更喜欢白天的特定时间?例如,在14:00-15:00之间?

    3. 我注意到,如果您安排任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行。我该如何避免这种行为?

1 个答案:

答案 0 :(得分:7)

jacktech24做得非常好,但如果有任何问题,我也会尽力。

  1. 似乎需要使用Google Play服务(此处)(使用Lollipop版Android时除外,它将使用普通的JobScheduler)。如果Google Play服务无法使用,我该怎么办?*

    如果Google Play服务不可用,则您无法使用此API。相反,Google Play服务客户端库旨在请求用户下载并安装Google Play服务,如果它检测到它已丢失,但我不相信GcmNetworkManager会这样做。

  2. 如果我不使用" setRequiredNetwork"那么任务的默认行为是什么? ?它是" NETWORK_STATE_ANY" ?*

    javadoc描述了哪个是默认值。

  3. 文档说明了从onRunTask返回的内容,我可以返回任何值" RESULT_FAILURE"," RESULT_RESCHEDULE"," RESULT_SUCCESS&# 34; (信息在这里)。似乎FAILURE和SUCCESS选项都会做同样的事情 - 从队列中删除任务。这是真的吗?如果是这样,它们之间究竟有什么区别?它们的功能是否不同?*

    这两者之间的唯一区别是,在adb shell dumpsys中它将显示您返回的内容,因此您可以使用它来解决问题。 另一个原因是,如果任务失败,要求客户返回成功是很奇怪的。"

  4. 是" TaskParams"仅用于任务的标签?我可以以某种方式使用API​​将包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吧?*

    在下一版本的GmsCore中,应支持向任务添加捆绑包的功能。

  5. 应用程序是否可以获取任务的队列?我知道可以使用adb,但也可以使用API​​吗?

    不,不可能。相反,您应该在需要时执行取消,如果任务不在那里则将是无操作。同样,您应该在代码中的某个位置安排任务,您可以在该位置查询任务列表。使用setUpdateCurrent = false确保它不会更新预先存在的任务。 AlarmManager以类似的方式工作,无论警报是否已经设置,您都可以设置警报 - api的设计遵循此目的。

  6. 他们说(这里)每个任务都有一个长达3分钟的唤醒锁。如果任务需要更多,应该怎么做?它应该为自己获得另一个唤醒锁吗? API是否会警告唤醒锁被释放?这是文档所说的内容:*

    是的,该应用程序应该获得自己的唤醒锁,一切都会好的。调度程序在3分钟后释放唤醒锁的原因是因为在实践中具有无限制的唤醒锁定超时仅导致真正难以追踪电池消耗错误。如果你需要超过3分钟,你有一个足够复杂的用例,你可以深入了解PowerManager API的工作方式并自己调用acquire()/ release()(它非常简单,事实是网络管理员为你做的更多是礼貌而不是其他任何事情。)

  7. 他们说(这里)每次应用程序升级/替换时都会删除所有网络任务,并且需要调用" onInitializeTasks"当发生这种情况时,您可以重新安排它们。我该如何重新安排任务?我不认为我甚至可以获得任务清单...... *

    您重新安排任务的方式与首先安排的方式相同。无论您使用哪种函数来安排它们,都可以从GcmTaskService#onInitializeTasks调用该函数。这样做是为了避免跨应用程序逻辑更改的延迟任务。考虑开发人员更改其任务时间表并开始使用其他标记的情况。他们在检测到升级后会被要求取消(old_tag)(他们必须添加更多代码),这意味着他们需要引用旧版(即使在他们的新代码中也没用。这意味着标签是一个稳定的标识符,不应该在应用升级之间发生变化 - 这不应该是此API的要求。

  8. 是否有可能告诉任务更喜欢白天的特定时间?例如,在14:00-15:00之间?*

    不,这种类型的后台调度会导致各种设备出现各种问题。即如果1台设备在15:00运行,那可能就好了。但如果1x10e6突然出现问题,那么你的服务器就会出现严重问题。

  9. 我注意到如果您安排任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行。我该如何避免这种行为?*

    不幸的是你不能,但这不是故意的,应该改变 - 应用程序在用户明确停止后应该无法运行。