实际上,Firebase Android JobDispatcher是围绕Android上的作业调度引擎的抽象层。现在,他们只有一个GCM Network Manager驱动程序实现。这意味着当前它的行为与GCM Network Manager的行为相同。希望将来会实施更多的驱动程序。
1.作业是否可以保留参数,甚至可以在需要时进行修改?他们在示例中说:“可选的用户提供的捆绑包。默认为空捆绑包。” 。是这个吗?可以在作业执行时对其进行修改吗?
- 是的,
Job.Builder
具有setExtras
任意束的方法,以后可以通过进行访问jobParameters.getExtras()
。您不能修改包(jobParameters
仅包含吸气剂)。您可以使用flag重新安排作业,setReplaceCurrent(true)
并指定一个新的捆绑包。
2.可以轻松地重新安排工作吗?有人说“一个布尔值,指示作业是否应该重复”。如何选择何时重新安排?我已经尝试过该示例,并选择了“ Recurring”,但它似乎没有再次运行,仅运行了一次。
- 要重新计划作业,您需要指定
setRecurring(true)
,setTrigger(Trigger.executionWindow(10, 20))
一旦达到窗口开始截止时间,就会触发此操作,并且鼓励驱动程序在可能的窗口结束之前运行作业。
3.是否可以保护它与库的工作(由于唯一的ID)?
作业标签在您的应用程序中必须是唯一的。手机上的其他应用程序都有自己的“端点”(程序包名称/服务名称)。要查看所有计划的/完成的工作,GooglePlayDriver
请使用
adb shell dumpsys activity service GcmService
4.更新应用程序时是否需要格外小心(就像以前的API一样)?更新应用程序后还能安排工作吗?在样本上进行测试,似乎工作在应用程序更新后完全消失了。可以避免吗?
- 至于GCM Network Manager
GooglePlayDriver
不会在Google Play服务或应用更新后重新安排作业。这是一个未解决的问题。所以现在这是您的责任。
5.是否需要RECEIVE_BOOT_COMPLETED,以确保即使重新启动设备后仍要计划作业?样本似乎有它。
- 是的,您需要这种许可。Builder有一个参数来控制行为:
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
当然,如果要创建自己的驱动程序,则必须自己照顾生命。
6.是否可以获取所有已调度作业及其信息(包括参数)的列表,并能够取消特定/全部作业甚至进行修改?
- 不,与GCM网络管理器相同。但是,您可以自己安排所有工作,同时安排其播放服务。
7.应用程序清除数据后,是否会删除作业?
- 是的,该作业将被删除。可能在先前版本的Google Play服务中,其行为有所不同。
8.是否可以告诉作业最好在一定时间范围内运行(例如:早晨7:00至8:00之间)?提到了“ ExecutionWindowTrigger,它指定应在其中执行作业的时间窗口”。是吗 错过此窗口会发生什么?
- 好的,您可以设置要在7:00触发的警报,并使用计划一个非重复性工作
executionWindow(0, 60*60)
。作业将在7:00-8:00之间运行。
您无法使用周期性工作,因为
windowStart-应该认为作业有资格最早运行(以秒为单位)。从计划作业的时间(对于新作业)或上次运行的时间(对于周期性作业)计算。
另外,ExecutionWindowTrigger指定近似时间。不保证它将在给定的窗口中运行。如果错过了窗口,该作业将在以后的任何时间运行。
9.“ JobService”类中的方法“ onStartJob”返回一个布尔值,其描述为“是否还有更多工作要做”。。这是什么意思?“ jobFinished”方法的“ needsReschedule”参数是什么意思?它们彼此相关吗?
- 如果
onStartJob
返回false,则表示您已完成工作。无需调用jobFinished
。将RESULT_SUCCESS
被自动发送。
如果onStartJob
返回true,则表示您已启动线程并等待结果。完成后,您必须调用,jobFinished
以通知Google Play服务是否应重新安排作业。如果是,作业将根据重新安排RetryStrategy
。
10.我应该知道哪些限制?例如每个功能的最小值和最大值?
onStartJob
应该尽快将工作卸载到另一个执行线程。它们提供了SimpleJobService
一个期望您的例子。
- Lollipop的没有驱动程序实现
JobScheduler
。当Google Play服务不可用时,还需要处理这种情况,我们应该Driver
基于实现AlarmManager
。