Firebase JobDispatcher – 与以前的API(JobScheduler和GcmTaskService)相比,它如何工作?
背景
Google有多种Job / JobScheduler
解决scheme,比如JobScheduler
和GcmTaskService
。 各有其优点和缺点。
最近,Google推出了一个名为“Firebase JobDispatcher”的新库。
问题
可悲的是,这个新的API几乎没有什么可读的。 事实上,真的很难find任何事情。
只有我find的是他们的宣传video和样品 。 但即使是他们,对这个API也没有太多的了解。
问题
回顾以前的问题,调查和比较其他API(例如, 在这里 ),我想问一下新的API是如何工作的,并且知道在使用时应该考虑什么:
-
一个作业是否有参数可以保留,甚至可以在需要时进行修改? 他们在样例中说:“ 一个可选的用户提供的附加组件,默认是一个空的Bundle。 ”是这样吗? 执行后可以修改吗?
-
工作是否可以轻松重新计划? 据说是一个表明工作是否应该重复的布尔值 。 如何重新安排时间呢? 我已经尝试过这个示例,并select了“重复”,但似乎并没有再次运行,只有一次。
-
它可以保护与图书馆的工作(由于独特的ID)?
-
更新应用程序时是否需要额外注意(如以前的API)? 应用程序更新后,作业是否仍然可以安排? 对样本进行testing,似乎应用程序更新后,工作完全消失。 可以避免吗?
-
是否需要
RECEIVE_BOOT_COMPLETED
来防止即使在设备重新启动的情况下仍然可以调度作业? 样品似乎有它。 -
是否有可能获得所有计划任务及其信息(包括参数)的列表,并能够取消特定/全部甚至修改它们?
-
通过应用程序的清除数据操作,将删除工作吗?
-
是否有可能告诉工作最好是在一定的时间内运行(例如早上7点到8点之间)? 它提到“ ExecutionWindowTrigger – 它指定了一个应该执行Job的时间窗口 ”。 是吗? 当它错过了这个窗口会发生什么?
-
JobService
类中的JobService
方法返回一个布尔值,其描述是“ 是否还有更多的工作。 ”这是什么意思?jobFinished
方法的needsReschedule
参数是jobFinished
意思? 他们是相互关联的吗? -
我应该知道有什么限制吗? 例如每个函数的最小值和最大值?
实际上,Firebase Android JobDispatcher是Android上的作业调度引擎的一个抽象层。 而现在,他们只有一个GCMnetworkingpipe理器的驱动程序实现。 这意味着它目前的行为与GCMnetworkingpipe理器的行为相同 。 希望将来能够实施更多的司机。
一个工作是否可以有一些参数可以保留,甚至可以在需要的时候进行修改? 他们在示例中说:“一个可选的用户提供的附加组件,默认是一个空的Bundle。” 。 是这个吗? 执行后可以修改吗?
- 是的,
Job.Builder
方法setExtras
具有任意捆绑,以后可以通过jobParameters.getExtras()
访问。 你不能修改这个包(jobParameters
只包含getters)。 您可以使用标志setReplaceCurrent(true)
重新安排您的工作,并指定一个新的捆绑包。
2.能否轻松地重新安排工作? 据说是一个表明工作是否应该重复的布尔值。 如何重新安排时间呢? 我已经尝试过这个示例,并select了“重复”,但似乎并没有再次运行,只有一次。
- 要重新安排工作,你需要指定
setRecurring(true)
,setTrigger(Trigger.executionWindow(10, 20))
一旦到达窗口开始的最后期限,就会触发它,如果可能的话,鼓励驱动程序在窗口结束之前运行作业。
3.它可以保护与图书馆的工作(由于独特的ID)?
-
作业标签在您的应用中必须是唯一的。 手机上的其他应用程序拥有自己的“端点”(包名称/服务名称)。 要查看
GooglePlayDriver
所有计划/完成作业,请使用adb shell dumpsys activity service GcmService
4.更新应用程序时是否需要额外注意(如之前的API)? 应用程序更新后,作业是否仍然可以安排? 对样本进行testing,似乎应用程序更新后,工作完全消失。 可以避免吗?
- 至于GCMnetworkingpipe理员,
GooglePlayDriver
在Google Play服务或应用更新后不会重新安排工作。 这是一个开放的问题 。 所以现在这是你的责任。
5.是否需要RECEIVE_BOOT_COMPLETED,以防止在设备重新启动的情况下还能安排作业? 样品似乎有它。
- 是的,你需要这样的权限。 Builder有一个参数来控制行为:
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
当然,如果你要创build自己的驱动程序,你必须自己照顾一生。
6.是否有可能获得所有预定作业及其信息(包括参数)的列表,并且能够取消特定的/所有的作业甚至修改它们?
- 不,和GCMnetworkingpipe理器一样。 但是你可以自己跟踪所有的工作,同时安排他们去玩服务。
7.通过应用程序的清晰数据操作,工作会被删除吗?
- 是的,这个工作将被删除。 可能在谷歌播放服务的以前版本中,它的行为有所不同。
8.是否可以告诉工作,最好是在一定的时间范围内运行(例如早上7点到8点之间)? 它提到“ExecutionWindowTrigger – 它指定了一个应该执行Job的时间窗口”。 是吗? 当它错过了这个窗口会发生什么?
- 那么,你可以设置一个警报在7点被解雇,并使用
executionWindow(0, 60*60)
安排一个非重复的工作。 这项工作将在7:00至8:00之间运行。
您不能使用重复作业,因为
windowStart – 作业应该被认为有资格运行的最早时间(以秒为单位)。 从计划作业(新作业)或上次作业(重复作业)计算。
此外,ExecutionWindowTrigger指定大致的时间。 它不能保证它会运行在给定的窗口。 如果错过了窗口,任务将在以后的任何时间运行。
9.“JobService”类中的“onStartJob”方法返回一个布尔值,其描述是“是否还有更多工作要做”。 。 这是什么意思? “jobFinished”方法的“needsReschedule”参数是什么意思? 他们是相互关联的吗?
- 如果
onStartJob
返回false,这意味着你完成了你的工作。 无需调用jobFinished
。RESULT_SUCCESS
自动发送。
如果onStartJob
返回true,则表示您启动了一个线程并等待结果。 如你所做,你必须调用jobFinished
来通知谷歌播放服务是否应该重新安排工作。 如果是,则根据RetryStrategy
重新安排工作。
10.我应该知道有什么限制吗? 例如每个函数的最小值和最大值?
-
-
onStartJob
应尽快将工作卸载到另一个执行线程。 他们提供了一个SimpleJobService
作为你所期望的一个例子。 - Lollipop的
JobScheduler
没有Driver实现。 另外需要处理的情况,当谷歌播放服务不可用,我们可能应该实现基于AlarmManager
Driver
。
-