首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于GcmTaskService的几个问题

关于GcmTaskService的几个问题
EN

Stack Overflow用户
提问于 2015-07-15 09:07:49
回答 2查看 6.2K关注 0票数 21

背景

我想使用新的JobScheduler API,这是在Lollipop上出现的,但遗憾的是,它没有一个官方的前Lollipop端口。

然而,还有GcmTaskService,它提供了非常类似的功能。

问题所在

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

问题

关于这个新API,我有几个问题:

  1. 它似乎需要Google服务(here必须被使用(除了使用安卓的Lollipop版本,它将使用普通的JobScheduler)。如果谷歌播放服务不可用,我该怎么办?
  2. 看起来,即使我对重复的任务使用了"setPersisted(true)“,但是当我重新启动设备时,任务就不会再被调用了。怎么会这样?编辑:那是因为我错过了RECEIVE_BOOT_COMPLETED的许可。
  3. 如果我不使用"setRequiredNetwork“,任务的默认行为是什么?是不是"NETWORK_STATE_ANY“?
  4. docs表示从onRunTask返回的内容,我可以返回任何值"RESULT_FAILURE“、"RESULT_RESCHEDULE”、"RESULT_SUCCESS“(info here)。失败选项和成功选项似乎都将完成相同的任务--从队列中删除任务。是真的吗?如果是的话,两者究竟有甚麽分别呢?它们的功能会有所不同吗?
  5. "TaskParams“是否仅用于任务的标记?我可以使用API将一个包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吗?
  6. 应用程序有可能获得任务的队列吗?我知道使用亚行是可能的,但也可以使用API吗?
  7. 他们说(here)每项任务都有最多3分钟的唤醒时间。如果任务需要更多的话,应该做什么?它应该为自己获得另一个觉醒吗?API会警告已经释放了唤醒吗?医生们是这么说的:

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

  1. 他们说(here,当应用程序升级/替换时,所有的网络任务都会被删除,当这种情况发生时,会有人呼吁"onInitializeTasks“,你可以重新安排它们。)我怎样才能重新安排任务?我想我连任务清单都找不到.
  2. 能告诉任务在一天中选择特定的时间吗?例如,14:00到15:00之间?
  3. 我注意到,如果您安排了一个任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行。我怎样才能避免这种行为?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-15 11:10:52

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

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

给那些没有回答的答案

7:您将不会在移除your时收到通知,而且正如他们在文档中所说的,此API仅用于短期任务,如果您有更长的时间,则编写您自己的实现

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

10:这是因为Google Play服务公司正在处理这个问题,而这是无法避免的。您必须在服务中检测应用程序是否已安装(我希望这是您的问题)。创建配置等,并最终在调用其中一个任务时取消所有任务。

票数 3
EN

Stack Overflow用户

发布于 2015-07-16 03:34:09

jacktech24做得很好,但我也会尝试,以防有任何悬而未决的问题。

  1. 它似乎要求使用Google服务(这里)(除了使用安卓的Lollipop版本,它将使用普通的JobScheduler)。如果谷歌播放服务不可用,我该怎么办?* 如果Google服务不可用,则不能使用此API。相反,Google客户端库的设计是为了要求用户下载并安装Google服务,如果它检测到丢失了它,但我不相信GcmNetworkManager会这样做。
  2. 如果我不使用"setRequiredNetwork“,任务的默认行为是什么?是"NETWORK_STATE_ANY“吗* javadoc描述的是缺省值。
  3. 文档中提到了从onRunTask返回的内容,我可以返回任何一个值"RESULT_FAILURE“、"RESULT_RESCHEDULE”、"RESULT_SUCCESS“(这里的信息)。失败选项和成功选项似乎都将完成相同的任务--从队列中删除任务。是真的吗?如果是的话,两者究竟有甚麽分别呢?它们的功能不同吗?* 这2之间唯一的区别是,在亚行shell虚拟库中,它将显示您返回的内容,因此您可以使用它来解决问题。另一个原因是,如果任务失败,要求客户端返回“成功”是很奇怪的。
  4. "TaskParams“是否仅用于任务的标记?我可以使用API将一个包传递给任务吗?否则,我需要设置一个DB来存储应该传递给任务的内容,对吗? 在下一个版本的GmsCore中,应该支持向任务添加包的能力。
  5. 应用程序有可能获得任务的队列吗?我知道使用亚行是可能的,但也可以使用API吗? 不不可能。相反,您应该在需要时执行cancel,如果任务不在那里,则为no。类似地,您应该在代码中查询任务列表的位置安排任务。使用setUpdateCurrent=false确保它不会更新预先存在的任务。AlarmManager以类似的方式工作,您将设置警报,而不管警报是否已经设置-- api是按照此设置设计的。
  6. 他们说(这里)每项任务最多有3分钟的唤醒时间。如果任务需要更多的话,应该做什么?它应该为自己获得另一个觉醒吗?API会警告已经释放了唤醒吗?医生们是这么说的:* 是的,应用程序应该有自己的觉醒,一切都会好起来的。调度程序在3分钟后释放唤醒的原因是因为在实践中,无限制的唤醒超时只会导致很难跟踪电池耗尽错误。如果您需要的时间超过3分钟,那么您就有了一个足够复杂的用例,您可以深入了解PowerManager API如何工作,并自己调用for ()/release()(非常简单,网络管理器为您做这件事比其他任何事情都更礼貌)。
  7. 他们说(在这里)每当应用程序升级/替换时,所有的网络任务都会被删除,当这种情况发生时,会有人呼吁"onInitializeTasks“,你可以重新安排它们。我怎样才能重新安排任务?我想我连任务清单都找不到* 您重新安排任务的方式与最初安排任务的方式相同。无论您用什么函数来调度它们,都可以从GcmTaskService#onInitializeTasks调用该函数。这样做是为了避免在整个应用程序逻辑变化中挥之不去的任务。考虑开发人员更改任务时间表并开始使用不同标记的情况。在检测到升级后,他们需要调用cancel(old_tag) (必须添加更多代码才能完成),这意味着即使在新代码中也需要对旧(未使用)标记的引用。这意味着标记是一个稳定的标识符,不应该在应用程序升级过程中更改--这不应该是这个api的要求。
  8. 能告诉任务在一天中选择特定的时间吗?例如,14:00-15:00之间?* 不,这种类型的后台调度会导致在大量设备中放牧的各种问题。也就是说,如果一个设备在15:00运行一个作业,那就很好了。但是,如果1x10e6突然出现问题,您的服务器就会出现严重问题。
  9. 我注意到,如果您安排了一个任务,然后强制停止和/或清除应用程序的数据,该任务仍将运行。我如何避免这种行为?* 不幸的是,你不能这样做,但这不是故意的,应该改变--在用户显式停止应用程序之后,应用程序不应该运行。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31426052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档