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

and*_*per 70 android android-jobscheduler firebase-job-dispatcher gcmtaskservice

背景

Google有多种工作/任务调度解决方案,例如JobSchedulerGcmTaskService.每个都有自己的优点和缺点.

最近,Google推出了一个名为"Firebase JobDispatcher"的新库.

问题

遗憾的是,关于这个新API的知识很少.事实上,很难找到任何关于它的东西.

我发现的只有他们的公告视频样本.但即使是他们,也没有太多关于这个API的知识.

问题

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

  1. 作业是否可以使用与之相关的参数,甚至可以在需要时进行修改?他们在示例中说" 一个可选的用户提供的附加软件包.默认是一个空的Bundle. "这是吗?它可以在执行时被作业修改吗?

  2. 工作可以轻松重新安排吗?它被称为" 一个布尔值,表明作业是否应该重复 ".怎样才能选择何时重新安排?我已经尝试了样本,并选择了"Recurring",但它似乎没有再次运行,只有一次.

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

  4. 更新应用程序时是否需要格外小心(如先前的API所做的那样)?更新应用后,仍可安排作业吗?对样本进行测试,似乎在更新应用程序后作业已完全消失.可以避免吗?

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

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

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

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

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

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

Fla*_*vio 100

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

1.作业是否具有与之相关的参数,甚至可以在需要时进行修改?他们在示例"一个可选的用户提供的附加软件包中说.默认是一个空的Bundle." .是这个吗?它可以在执行时被作业修改吗?

  1. 是的,Job.BuildersetExtras任意捆绑的方法,以后可以通过访问jobParameters.getExtras().您无法修改捆绑包(jobParameters仅包含getter).您可以使用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网络管理器GooglePlayDriver在Google Play服务或应用更新后不会重新安排作业.这是一个未解决的问题.所以现在这是你的责任.

5.是否需要RECEIVE_BOOT_COMPLETED以防我希望即使重启设备也能安排作业?样本似乎有它.

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

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

  1. 不,与GCM网络管理器相同.但是,您可以在安排他们播放服务时以某种方式自己跟踪所有工作.

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. if onStartJob返回false表示您已完成工作.无需调用jobFinished.将RESULT_SUCCESS被自动发送.

if onStartJob返回true表示您启动了一个线程并等待结果.作为你做的soos,你必须调用jobFinished通知谷歌播放服务是否应该重新安排工作.如果是的话,工作将根据具体情况重新安排RetryStrategy.

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

    • onStartJob应该尽快将工作卸载到另一个执行线程.它们提供了SimpleJobService一个例子,说明了您的期望.
    • Lollipop没有Driver实现JobScheduler.当谷歌播放服务不可用时还需要处理这种情况,我们应该Driver在此基础上实现AlarmManager.