关于GcmTaskService的一些问题

Some questions about GcmTaskService

背景

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

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

问题

这个API很新,所以很少有地方可以找到如何使用它的信息(例如here and here)。

问题

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

  1. 似乎需要使用 Google Play Services (here)(使用 Lollipop 版本 Android 时除外,它将使用正常的 JobScheduler)。 Google播放服务不可用怎么办?

  2. 看来虽然我用了"setPersisted(true)"重复了一个任务,但是当我重启设备的时候,这个任务就不会再被调用了。怎么会? 编辑:那是因为我错过了 RECEIVE_BOOT_COMPLETED 的许可。

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

  4. docs say about what's returned from onRunTask , I can return any of the values "RESULT_FAILURE", "RESULT_RESCHEDULE", "RESULT_SUCCESS" (info here)。似乎 FAILURE 和 SUCCESS 选项都会做同样的事情——从队列中删除任务。是真的吗?如果是这样,它们之间到底有什么区别?它们的功能是否不同?

  5. TaskParams”是否只用于任务的标签?我可以使用 API 以某种方式将捆绑包传递给任务吗?否则,我需要设置一个数据库来存储应该传递给任务的内容,对吧?

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

  7. 他们说(here)每个任务最多有 3 分钟的唤醒锁。如果任务需要更多,应该做什么?它应该为自己获取另一个唤醒锁吗? API 会警告唤醒锁已释放吗?文档是这样说的:

The scheduler will hold a PowerManager.WakeLock for your service, however after three minutes of execution if your task has not returned it will be considered to have timed out, and the wakelock will be released. Rescheduling your task at this point will have no effect. If you suspect your task will run longer than this you should start your own service explicitly or use some other mechanism; this API is intended for relatively quick network operations.

  1. 他们说 (here) 每次应用程序获得 upgraded/replaced 时,所有网络任务都会被删除,并且会调用 "onInitializeTasks"发生了,您可以再次重新安排它们。我怎样才能重新安排任务?我想我连任务清单都拿不到...

  2. 是否可以告诉任务选择一天中的特定时间?例如,在 14:00-15:00 ?

  3. 之间
  4. 我注意到如果你安排了一个任务,然后你强行停止and/or清除应用程序的数据,任务仍然会运行。我怎样才能避免这种行为?

您可以在这里找到大部分问题的答案。

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

那里没有回答的答案

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

9:不,你现在不能,API 不允许

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

jacktech24 做得非常好,但我也会尝试,以防有任何挥之不去的问题。

  1. 似乎需要使用 Google Play Services(此处)(使用 Lollipop 版本的 Android 时除外,它将使用普通的 JobScheduler)。 Google播放服务不可用怎么办?*

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

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

    javadoc 描述了默认值。

  3. 文档说的是 return 从 onRunTask 编辑的内容,我可以 return 任何值 "RESULT_FAILURE"、"RESULT_RESCHEDULE"、"RESULT_SUCCESS"(信息在这里)。似乎 FAILURE 和 SUCCESS 选项都会做同样的事情——从队列中删除任务。是真的吗?如果是这样,它们之间到底有什么区别?它们的功能是否不同?*

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

  4. 就奇怪了
  5. "TaskParams"是否只用于任务的标签?我可以使用 API 以某种方式将捆绑包传递给任务吗?否则,我需要设置一个数据库来存储应该传递给任务的内容,对吗?*

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

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

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

  7. 他们说(这里)每个任务都有最多 3 分钟的唤醒锁。如果任务需要更多,应该做什么?它应该为自己获取另一个唤醒锁吗? API 会警告唤醒锁已释放吗?文档是这样说的:*

    是的,应用程序应该获得自己的唤醒锁,一切都会好起来的。调度程序在 3 分钟后释放唤醒锁的原因是因为在实践中,无限的唤醒锁超时只会导致很难追踪电池耗尽错误。如果您需要超过 3 分钟的时间,那么您有一个足够复杂的用例,您可以深入了解 PowerManager API 的工作原理并自己调用 acquire()/release()(这真的很简单,事实是网络管理员为您做这件事比其他任何事情都更礼貌)。

  8. 他们说(这里)所有网络任务都会在每次应用程序获得 upgraded/replaced 时删除,并且当发生这种情况时会调用 "onInitializeTasks",并且您可以重新安排他们。我怎样才能重新安排任务?我想我什至无法获得任务列表...*

    您重新安排任务的方式与最初安排任务的方式相同。无论您使用什么函数来安排它们,都可以从 GcmTaskService#onInitializeTasks 调用该函数。这样做是为了避免跨应用程序逻辑更改的延迟任务。考虑开发人员更改他们的任务时间表并开始使用不同标签的情况。他们将需要在检测到升级后调用 cancel(old_tag) (他们必须添加更多代码才能完成),这意味着他们需要引用旧的(未使用的)甚至在他们的新代码中标记。这意味着标签是一个稳定的标识符,不应该在应用程序升级时改变——这不应该是这个 api.

  9. 的要求
  10. 是否可以告诉任务选择一天中的特定时间?例如,在 14:00-15:00 ?*

    之间

    不,这种类型的后台调度会导致大量设备之间的群聚问题。 IE。如果 1 台设备 运行 在 15:00 工作,那可能没问题。但是如果 1x10e6 做突然你的服务器有严重的问题。

  11. 我注意到如果你安排了一个任务,然后你强行停止and/or清除应用程序的数据,任务仍然会运行。我怎样才能避免这种行为?*

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