关于GcmTaskService的一些问题

and*_*per 21 android android-5.0-lollipop android-jobscheduler gcmtaskservice

背景

我想使用Lollipop上提供的新JobScheduler API,但遗憾的是它没有用于pre-Lollipop的官方端口.

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

问题

这个API很新,所以很少有地方可以查找如何使用它的信息(例如这里这里).

问题

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

  1. 它似乎需要使用Google Play服务(此处)(除非使用Lollipop版本的Android,它将使用正常的JobScheduler).如果Google Play服务不可用,我该怎么办?

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

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

  4. 文档说一下什么是从onRunTask回来后,我可以返回任何值"RESULT_FAILURE","RESULT_RESCHEDULE","RESULT_SUCCESS"(信息的位置).似乎FAILURE和SUCCESS选项都会做同样的事情 - 从队列中删除任务.这是真的吗?如果是这样,它们之间究竟有什么区别?他们的功能不同吗?

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

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

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

调度程序将为您的服务保留一个PowerManager.WakeLock,但是如果您的任务没有返回,执行三分钟后,它将被视为已超时,并且将释放唤醒锁.此时重新安排任务将不起作用.如果您怀疑自己的任务运行时间超过此时间,则应明确启动自己的服务或使用其他机制; 此API旨在用于相对快速的网络操作.

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

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

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

43m*_*hew 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"(这里的信息).似乎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调用该函数.这样做是为了避免跨应用程序逻辑更改的延迟任务.考虑开发人员更改其任务时间表并开始使用其他标记的情况.他们在检测到升级后需要调用cancel(old_tag)(他们必须添加更多代码),这意味着他们需要引用旧的(未使用过的)标签,即使在他们的新代码.这意味着标签是一个稳定的标识符,不应该在应用程序升级中发生变化 - 这不应该是此API的要求.

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

    不,这种类型的背景调度会导致各种设备上的各种问题.也就是说,如果1台设备在15:00运行,那可能就好了.但是,如果1x10e6突然发生了您的服务器出现严重问题.

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

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


fil*_*och 3

您可以在这里找到大多数问题的答案。

https://github.com/jacktech24/gcmnetworkmanager-android-example/blob/master/README.md

对于那里没有答案的答案

7:当唤醒锁被删除时,您不会收到通知,正如文档中所说,此 API 仅适用于短任务,如果您有更长的任务,请编写自己的实现

9:不,目前还不能,API 不允许

10:那是因为 Google Play 服务正在处理它,并且没有办法解决它。您必须在服务中检测应用程序是否已设置(我希望这是您的问题),例如。创建配置等,并最终在调用其中之一时取消所有任务。