Firebase JobDispatcher-与以前的API(JobScheduler和GcmTaskService)相比,它如何工作?


70

背景

Google提供了多种作业/任务计划解决方案,例如JobSchedulerGcmTaskService。每种都有自己的优点和缺点。

最近,Google提供了一个名为“ Firebase JobDispatcher”的新库。

问题

可悲的是,关于这个新API的知识很少。实际上,很难找到任何有关它的信息。

我唯一发现的是他们的公告视频样本。但是即使是他们,对此API也知之甚少。

问题

回顾以前与其他API(例如此处)的问题,调查和比较,我想问一下新API的工作原理,并知道在使用新API时要考虑的因素:

  1. 作业是否可以保留参数,甚至可以在需要时进行修改?他们在示例中说:“可选的用户提供的附加捆绑包。默认值为空捆绑包。 ”这是吗?可以在作业执行时对其进行修改吗?

  2. 可以轻松地重新安排工作吗?有人说“一个布尔值,表示作业是否应该重复”。如何选择何时重新安排?我已经尝试过该示例,然后选择“重复发生”,但它似乎没有再次运行,仅运行了一次。

  3. 相对于图书馆的工作,可以保护它吗(由于唯一的ID)?

  4. 在更新应用程序时是否需要格外小心(就像以前的API一样)?更新应用程序后仍可以安排工作吗?在样本上进行测试,似乎工作在应用程序更新后完全消失了。可以避免吗?

  5. RECEIVE_BOOT_COMPLETED如果即使重新启动设备,我仍然希望安排作业,是否需要?样本似乎有它。

  6. 是否可以获取所有已调度作业及其信息(包括参数)的列表,并且可以取消特定/全部作业甚至进行修改?

  7. 应用清除数据操作后会删除作业吗?

  8. 是否可以告诉作业最好在一定时间范围内运行(例如:早晨7:00至8:00之间)?提到了“ ExecutionWindowTrigger,它指定了应在其中执行作业的时间窗口”。是吗 错过此窗口会发生什么?

  9. 该方法onStartJobJobService类返回一个布尔和它的说明“是否有剩余的更多的工作。 ”这是什么意思?方法的needsReschedule参数是什么jobFinished意思?它们彼此相关吗?

  10. 我应该知道什么限制吗?例如每个功能的最小值和最大值?


1
嗨,我已经使用了这个lib几天了,对于#2来说,它对我来说是重复出现的,但是它似乎不遵守执行窗口中指定的数字。
eriuzo

1
@eriuzo它如何再次出现在您身上?每多少秒/分钟?您是如何做到的?
Android开发人员

1
@op我没有第一次记录数字,让我记录一下,也许我明天会发布答案
eriuzo

我有同样的问题。尤其是在Google documentatio上无法很好地解释此功能。但是这个链接developer.android.com/topic/performance/scheduling.html#af对我来说很棒。您以前看过此文档吗?现在,我了解了为什么Google Firebase.JobSchedule
拉斐尔·帕切科

Answers:


102

实际上,Firebase Android JobDispatcher是围绕Android上的作业调度引擎的抽象层。现在,他们只有一个GCM Network Manager驱动程序实现。这意味着当前它的行为与GCM Network Manager的行为相同。希望将来会实施更多的驱动程序。

1.作业是否可以保留参数,甚至可以在需要时进行修改?他们在示例中说:“可选的用户提供的捆绑包。默认为空捆绑包。” 。是这个吗?可以在作业执行时对其进行修改吗?

  1. 是的,Job.Builder具有setExtras任意束的方法,以后可以通过进行访问jobParameters.getExtras()。您不能修改包(jobParameters仅包含吸气剂)。您可以使用flag重新安排作业,setReplaceCurrent(true)并指定一个新的捆绑包。

2.可以轻松地重新安排工作吗?有人说“一个布尔值,指示作业是否应该重复”。如何选择何时重新安排?我已经尝试过该示例,并选择了“ Recurring”,但它似乎没有再次运行,仅运行了一次。

  1. 要重新计划作业,您需要指定setRecurring(true)setTrigger(Trigger.executionWindow(10, 20))

一旦达到窗口开始截止时间,就会触发此操作,并且鼓励驱动程序在可能的窗口结束之前运行作业。

3.是否可以保护它与库的工作(由于唯一的ID)?

  1. 作业标签在您的应用程序中必须是唯一的。手机上的其他应用程序都有自己的“端点”(程序包名称/服务名称)。要查看所有计划的/完成的工作,GooglePlayDriver请使用

    adb shell dumpsys activity service GcmService

4.更新应用程序时是否需要格外小心(就像以前的API一样)?更新应用程序后还能安排工作吗?在样本上进行测试,似乎工作在应用程序更新后完全消失了。可以避免吗?

  1. 至于GCM Network ManagerGooglePlayDriver不会在Google Play服务或应用更新后重新安排作业。这是一个未解决的问题。所以现在这是您的责任。

5.是否需要RECEIVE_BOOT_COMPLETED,以确保即使重新启动设备后仍要计划作业?样本似乎有它。

  1. 是的,您需要这种许可。Builder有一个参数来控制行为:setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT) 当然,如果要创建自己的驱动程序,则必须自己照顾生命。

6.是否可以获取所有已调度作业及其信息(包括参数)的列表,并能够取消特定/全部作业甚至进行修改?

  1. 不,与GCM网络管理器相同。但是,您可以自己安排所有工作,同时安排其播放服务。

7.应用程序清除数据后,是否会删除作业?

  1. 是的,该作业将被删除。可能在先前版本的Google Play服务中,其行为有所不同。

8.是否可以告诉作业最好在一定时间范围内运行(例如:早晨7:00至8:00之间)?提到了“ ExecutionWindowTrigger,它指定应在其中执行作业的时间窗口”。是吗 错过此窗口会发生什么?

  1. 好的,您可以设置要在7:00触发的警报,并使用计划一个非重复性工作executionWindow(0, 60*60)。作业将在7:00-8:00之间运行。
    您无法使用周期性工作,因为

    windowStart-应该认为作业有资格最早运行(以秒为单位)。从计划作业的时间(对于新作业)或上次运行的时间(对于周期性作业)计算。

另外,ExecutionWindowTrigger指定近似时间。不保证它将在给定的窗口中运行。如果错过了窗口,该作业将在以后的任何时间运行。

9.“ JobService”类中的方法“ onStartJob”返回一个布尔值,其描述为“是否还有更多工作要做”。。这是什么意思?“ jobFinished”方法的“ needsReschedule”参数是什么意思?它们彼此相关吗?

  1. 如果onStartJob返回false,则表示您已完成工作。无需调用jobFinished。将RESULT_SUCCESS被自动发送。

如果onStartJob返回true,则表示您已启动线程并等待结果。完成后,您必须调用,jobFinished以通知Google Play服务是否应重新安排作业。如果是,作业将根据重新安排RetryStrategy

10.我应该知道哪些限制?例如每个功能的最小值和最大值?

    • onStartJob应该尽快将工作卸载到另一个执行线程。它们提供了SimpleJobService一个期望您的例子。
    • Lollipop的没有驱动程序实现JobScheduler。当Google Play服务不可用时,还需要处理这种情况,我们应该Driver基于实现AlarmManager

这次真是万分感谢。可悲的是,我很久以前就离开了这个问题。我会为您的努力表示支持,但是由于我不知道这样做有多好,因此我仍然不会将其标记为已接受。也许有一天我会再次回到它并标记它。
Android开发者

1
在回答之前先看到引用的问题会很有帮助。现在必须来回滚动。
azizbekian

“我应该知道什么限制吗?” 需要注意的是-对于大多数Firebase而言-Android客户端是封闭源,并且包含对GPS的奇特依赖。这使Google可以控制它的使用,并阻止您的应用程序在Amazon Android或中国大多数Android设备上运行。
汤姆(Tom)

辉煌的答案清除很多基本的东西,你能帮帮我,我的问题在这里
沙善chandak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.