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

背景

Google有多种Job / JobScheduler解决scheme,比如JobSchedulerGcmTaskService 。 各有其优点和缺点。

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

问题

可悲的是,这个新的API几乎没有什么可读的。 事实上,真的很难find任何事情。

只有我find的是他们的宣传video和样品 。 但即使是他们,对这个API也没有太多的了解。

问题

回顾以前的问题,调查和比较其他API(例如, 在这里 ),我想问一下新的API是如何工作的,并且知道在使用时应该考虑什么:

  1. 一个作业是否有参数可以保留,甚至可以在需要时进行修改? 他们在样例中说:“ 一个可选的用户提供的附加组件,默认是一个空的Bundle。 ”是这样吗? 执行后可以修改吗?

  2. 工作是否可以轻松重新计划? 据说是一个表明工作是否应该重复的布尔值 。 如何重新安排时间呢? 我已经尝试过这个示例,并select了“重复”,但似乎并没有再次运行,只有一次。

  3. 它可以保护与图书馆的工作(由于独特的ID)?

  4. 更新应用程序时是否需要额外注意(如以前的API)? 应用程序更新后,作业是否仍然可以安排? 对样本进行testing,似乎应用程序更新后,工作完全消失。 可以避免吗?

  5. 是否需要RECEIVE_BOOT_COMPLETED来防止即使在设备重新启动的情况下仍然可以调度作业? 样品似乎有它。

  6. 是否有可能获得所有计划任务及其信息(包括参数)的列表,并能够取消特定/全部甚至修改它们?

  7. 通过应用程序的清除数据操作,将删除工作吗?

  8. 是否有可能告诉工作最好是在一定的时间内运行(例如早上7点到8点之间)? 它提到“ ExecutionWindowTrigger – 它指定了一个应该执行Job的时间窗口 ”。 是吗? 当它错过了这个窗口会发生什么?

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

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

实际上,Firebase Android JobDispatcher是Android上的作业调度引擎的一个抽象层。 而现在,他们只有一个GCMnetworkingpipe理器的驱动程序实现。 这意味着它目前的行为与GCMnetworkingpipe理器的行为相同 。 希望将来能够实施更多的司机。

一个工作是否可以有一些参数可以保留,甚至可以在需要的时候进行修改? 他们在示例中说:“一个可选的用户提供的附加组件,默认是一个空的Bundle。” 是这个吗? 执行后可以修改吗?

  1. 是的, Job.Builder方法setExtras具有任意捆绑,以后可以通过jobParameters.getExtras()访问。 你不能修改这个包( jobParameters只包含getters)。 您可以使用标志setReplaceCurrent(true)重新安排您的工作,并指定一个新的捆绑包。

2.能否轻松地重新安排工作? 据说是一个表明工作是否应该重复的布尔值。 如何重新安排时间呢? 我已经尝试过这个示例,并select了“重复”,但似乎并没有再次运行,只有一次。

  1. 要重新安排工作,你需要指定setRecurring(true)setTrigger(Trigger.executionWindow(10, 20))

一旦到达窗口开始的最后期限,就会触发它,如果可能的话,鼓励驱动程序在窗口结束之前运行作业。

3.它可以保护与图书馆的工作(由于独特的ID)?

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

    adb shell dumpsys activity service GcmService

4.更新应用程序时是否需要额外注意(如之前的API)? 应用程序更新后,作业是否仍然可以安排? 对样本进行testing,似乎应用程序更新后,工作完全消失。 可以避免吗?

  1. 至于GCMnetworkingpipe理员, GooglePlayDriver在Google Play服务或应用更新后不会重新安排工作。 这是一个开放的问题 。 所以现在这是你的责任。

5.是否需要RECEIVE_BOOT_COMPLETED,以防止在设备重新启动的情况下还能安排作业? 样品似乎有它。

  1. 是的,你需要这样的权限。 Builder有一个参数来控制行为: setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)当然,如果你要创build自己的驱动程序,你必须自己照顾一生。

6.是否有可能获得所有预定作业及其信息(包括参数)的列表,并且能够取消特定的/所有的作业甚至修改它们?

  1. 不,和GCMnetworkingpipe理器一样。 但是你可以自己跟踪所有的工作,同时安排他们去玩服务。

7.通过应用程序的清晰数据操作,工作会被删除吗?

  1. 是的,这个工作将被删除。 可能在谷歌播放服务的以前版本中,它的行为有所不同。

8.是否可以告诉工作,最好是在一定的时间范围内运行(例如早上7点到8点之间)? 它提到“ExecutionWindowTrigger – 它指定了一个应该执行Job的时间窗口”。 是吗? 当它错过了这个窗口会发生什么?

  1. 那么,你可以设置一个警报在7点被解雇,并使用executionWindow(0, 60*60)安排一个非重复的工作。 这项工作将在7:00至8:00之间运行。
    您不能使用重复作业,因为

    windowStart – 作业应该被认为有资格运行的最早时间(以秒为单位)。 从计划作业(新作业)或上次作业(重复作业)计算。

此外,ExecutionWindowTrigger指定大致的时间。 它不能保证它会运行在给定的窗口。 如果错过了窗口,任务将在以后的任何时间运行。

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

  1. 如果onStartJob返回false,这意味着你完成了你的工作。 无需调用jobFinishedRESULT_SUCCESS自动发送。

如果onStartJob返回true,则表示您启动了一个线程并等待结果。 如你所做,你必须调用jobFinished来通知谷歌播放服务是否应该重新安排工作。 如果是,则根据RetryStrategy重新安排工作。

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

    • onStartJob应尽快将工作卸载到另一个执行线程。 他们提供了一个SimpleJobService作为你所期望的一个例子。
    • Lollipop的JobScheduler没有Driver实现。 另外需要处理的情况,当谷歌播放服务不可用,我们可能应该实现基于AlarmManager Driver