Google有多种解决方案可用于作业/任务安排,例如JobScheduler
和GcmTaskService
。每个都有自己的优点和缺点。
最近,Google推出了一个名为" Firebase JobDispatcher"的新图书馆。
可悲的是,关于这个新API的内容很少。事实上,很难找到任何相关内容。
我发现的只有announcement video和a sample。但即使是他们,也没有太多关于这个API的知识。
查看之前的问题,调查和我与其他API(例如here)的比较,我想询问新API的工作原理,并了解在使用时需要考虑的因素它:
作业是否有参数可以保留,甚至可以在需要时进行修改?他们在样本" 中说出了一个可选的用户提供的附加软件包。默认为空Bundle。"是这个吗?可以在执行时修改作业吗?
可以轻松重新安排工作吗?据说" 一个布尔值,表示作业是否应重复" 。怎样才能选择何时重新安排?我已经尝试过这个样本,并选择了" Recurring",但它似乎再次运行,只有一次。
它可以保护与图书馆的工作(因为独特的ID)吗?
更新应用时是否需要格外小心(如先前的API所做的那样)?更新应用后,仍可安排作业吗?对样本进行测试,似乎在更新应用程序后作业已完全消失。可以避免吗?
是否需要RECEIVE_BOOT_COMPLETED
以防我希望即使重启设备也能安排作业?样本似乎有它。
是否可以获取所有预定作业及其信息(包括参数)的列表,并且能够取消特定/所有作业甚至修改它们?
在应用程序清除数据操作后是否会删除作业?
是否有可能告诉工作它会在一段时间内运行(例如:早上7点到8点之间)?它被提及" ExecutionWindowTrigger - 它指定了一个应该执行作业的时间窗口"。是吗?错过这个窗口会发生什么?
onStartJob
类中的方法JobService
返回一个布尔值,其描述为" 是否还有剩余工作量。&#34 ;这是什么意思? needsReschedule
方法的jobFinished
参数是什么意思?它们是否相互关联?
我应该知道哪些限制?例如minimal&每个函数的最大值?
答案 0 :(得分:97)
实际上Firebase Android JobDispatcher是Android上作业调度引擎的一个抽象层。 目前,他们只有一个GCM网络管理器的驱动程序实现。 这意味着它目前的行为与GCM Network Manager behaves相同。希望将来可以实施更多的驱动程序。
<强> 1。作业是否可以使用与之相关的参数,甚至可以在需要时进行修改?他们在样本&#34;可选的用户提供的附加软件包中说。默认为空Bundle。&#34; 。是这个吗?可以在执行时修改作业吗?
Job.Builder
方法setExtras
包含任意捆绑,以后可以通过jobParameters.getExtras()
访问。
您无法修改捆绑包(jobParameters
仅包含getter)。您可以使用标记setReplaceCurrent(true)
重新安排作业并指定新的包。<强> 2。工作可以轻松重新安排吗?据说&#34;一个布尔值,指示作业是否应该重复&#34; 。怎样才能选择何时重新安排?我已经尝试了样本,并选择了#34; Recurring&#34;,但它似乎再次运行,只有一次。
setRecurring(true)
,setTrigger(Trigger.executionWindow(10, 20))
一旦窗口开始截止日期,就会触发此操作 达到了,鼓励司机在窗前开办工作 如果可能的话结束。
第3。是否可以保护图书馆的工作(因为有独特的ID)?
作业标签在您的应用中必须是唯一的。手机上的其他应用程序都有自己的端点&#39; (包名/服务名称)。
要查看GooglePlayDriver
的所有预定/已完成作业,请使用
adb shell dumpsys activity service GcmService
<强> 4。更新应用程序时是否需要格外小心(如先前的API所做的那样)?更新应用后,仍可安排作业吗?对样本进行测试,似乎在更新应用程序后作业已完全消失。可以避免吗?
GooglePlayDriver
在Google Play服务或应用更新后不会重新安排作业。
这是open issue。所以现在这是你的责任。<强> 5。它是否需要RECEIVE_BOOT_COMPLETED以防我希望即使重启设备也能安排作业?样本似乎有它。
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
当然,如果您要创建自己的驱动程序,您将不得不自己照顾生命。<强> 6。是否可以获取所有预定作业及其信息(包括参数)的列表,并能够取消特定/所有作业甚至修改它们?
<强> 7。在应用程序的清晰数据操作时是否会删除作业?
<强> 8。是否有可能告诉工作它在一段时间内运行是否最好(例如:早上7点到8点之间)?它被提到&#34; ExecutionWindowTrigger - 它指定了一个应该执行Job的时间窗口&#34; 。是吗?错过这个窗口会发生什么?
executionWindow(0, 60*60)
安排一个非经常性的工作。这项工作将在7:00至8:00之间运行
你不能使用经常性的工作,因为
windowStart - 作业应该是最早的时间(以秒为单位) 被认为有资格运行。从作业计划的时间开始计算 (用于新工作)或最后一次工作(用于重复工作)。
此外,ExecutionWindowTrigger指定大致时间。它不能保证它会在给定的窗口运行。 如果它错过了窗口,作业将在以后的任何时间运行。
<强> 9。方法&#34; onStartJob&#34;在&#34; JobService&#34; class返回一个布尔值,其描述为&#34;是否还剩下更多的工作。&#34; 。这是什么意思? &#34; needsReschedule&#34;是什么?参数&#34; jobFinished&#34;方法意思?它们是否相互关联?
onStartJob
返回false表示您已完成工作。无需调用jobFinished
。 RESULT_SUCCESS
会自动发送。如果onStartJob
返回true,则意味着您启动了一个线程并等待结果。与您一样,您必须调用jobFinished
来通知Google Play服务是否应该重新安排这项工作。如果是,则将根据RetryStrategy
重新安排作业。
<强> 10。我应该知道有什么限制吗?例如,每个函数的最小值和最大值是什么?
onStartJob
应该尽快将工作卸载到另一个执行线程。它们以SimpleJobService
为例,说明您的期望。 JobScheduler
没有驱动程序实现。还需要处理谷歌播放服务不可用的情况,我们应该基于Driver
实施AlarmManager
。