Firebase JobDispatcher-与以前的API(JobScheduler和GcmTaskService)相



背景

谷歌有多种作业/任务调度解决方案,如JobSchedulerGcmTaskService。每个人都有自己的优点和缺点。

最近,谷歌推出了一个名为"FirebaseJobDispatcher"的新库。

问题

遗憾的是,关于这个新的API,几乎没有什么可读的。事实上,很难找到任何关于它的信息

我只找到了他们的公告视频和一个样本。但即使是他们,对这个API也没有太多的了解。

问题

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

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

  2. 作业可以很容易地重新安排吗?据说">一个布尔值,指示作业是否应重复"。如何选择何时重新安排?我尝试过这个示例,并选择了"递归",但它似乎不会再次运行,只有一次。

  3. 相对于库的作业(因为有唯一的id),它能得到保护吗?

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

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

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

  7. 在清除应用程序的数据操作后,作业会被删除吗?

  8. 是否可以告诉作业,它最好在一定的时间内运行(例如:早上7:00到8:00之间)?其中提到"ExecutionWindowTrigger,它指定了一个执行作业的时间窗口"。就是这样吗?当它错过这个窗口时会发生什么?

  9. JobService类中的方法onStartJob返回一个布尔值,其描述为">是否还有更多的工作要做。"这意味着什么?jobFinished方法的needsReschedule参数是什么意思?他们彼此有亲戚关系吗?

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

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

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

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

2.作业可以轻松地重新安排吗?它被称为"指示作业是否应该重复的布尔值"。如何选择何时重新安排?我尝试过这个示例,并选择了"递归",但它似乎不会再次运行,只有一次

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

一旦窗口开始截止日期为已达到,并且鼓励驾驶员在窗口之前运行作业如果可能的话结束。

3.相对于库的作业,它是否可以受到保护(因为有唯一的id)

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

    adb shell dumpsys activity service GcmService

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

  1. 至于GCM Network Manager,GooglePlayDriver不会在Google Play Services或应用程序更新后重新安排作业。这是一个悬而未决的问题。所以现在这是你的责任

5.如果我希望即使在设备重新启动时仍安排作业,是否需要RECEIVE_BOOT_COMPLED?样品似乎有。

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

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

  1. 否,与GCM Network Manager相同。但你可以自己跟踪所有的工作,同时安排他们玩服务

7.应用程序的清除数据操作后,作业会被删除吗

  1. 是的,该作业将被删除。可能在之前版本的谷歌播放服务中,它的表现有所不同

8.是否可以告诉作业,它最好在一段时间内运行(例如:早上7:00到8:00之间)?其中提到"ExecutionWindowTrigger,它指定了应在其中执行作业的时间窗口"。就是这样吗?当它错过这个窗口时会发生什么

  1. 好吧,你可以设置一个在7:00触发的警报,并用executionWindow(0, 60*60)安排一个非重复性作业。作业将在7:00到8:00之间运行。
    您不能使用定期作业,因为

    windowStart-作业应在被认为有资格参选。从计划作业的时间开始计算(对于新作业)或上次运行(对于重复作业)。

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

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

  1. 如果onStartJob返回false,则表示您已完成工作。无需调用jobFinishedRESULT_SUCCESS是自动发送的

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

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

    • onStartJob应尽快将工作卸载到另一个执行线程。他们提供了一个SimpleJobService作为对您期望的示例
    • Lollipop的JobScheduler没有驱动程序实现。还需要处理google play服务不可用的情况,我们可能应该在AlarmManager的基础上实现Driver

相关内容

  • 没有找到相关文章

最新更新