实际上 Firebase Android JobDispatcher 是围绕 Android 上的作业调度引擎的一个抽象层。现在他们只有一个 GCM 网络管理器的驱动程序实现。这意味着目前它的行为方式与GCM 网络管理器的行为方式相同。希望将来会实施更多的驱动程序。
1. 作业是否可以有参数保留,甚至可以在需要时进行修改?他们在示例中说“用户提供的附加功能的可选捆绑包。默认为空捆绑包。” . 是这个吗?它可以在执行时被作业修改吗?
- 是的,
Job.Builder
具有setExtras
任意捆绑的方法,以后可以通过jobParameters.getExtras()
. 您不能修改捆绑包(jobParameters
仅包含 getter)。您可以使用标志重新安排您的工作setReplaceCurrent(true)
并指定一个新的捆绑包。
2. 可以轻松地重新安排工作吗?据说“一个布尔值,指示作业是否应该重复”。如何选择何时重新安排?我已经尝试了该示例,并选择了“重复”,但它似乎没有再次运行,只有一次。
- 要重新安排工作,您需要指定
setRecurring(true)
,setTrigger(Trigger.executionWindow(10, 20))
一旦到达窗口开始截止日期,就会触发此操作,如果可能,鼓励司机在窗口结束之前运行作业。
3. 与图书馆的工作相比,它可以受到保护吗(因为唯一的 ID)?
工作标签在您的应用程序中必须是唯一的。手机上的其他应用程序有自己的“端点”(包名称/服务名称)。要查看所有已安排/已完成的作业,GooglePlayDriver
请使用
adb shell dumpsys activity service GcmService
4. 更新应用程序时是否需要格外小心(就像以前的 API 一样)?应用程序更新后还能安排工作吗?对样本进行测试,似乎在更新应用程序后工作完全消失了。可以避免吗?
- 至于 GCM 网络管理器
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
。
ifonStartJob
返回 true 表示您启动了一个线程并等待结果。完成后,您必须调用jobFinished
以通知 google play 服务是否应该重新安排工作。如果是,则工作将根据 重新安排RetryStrategy
。
10. 有什么我应该知道的限制吗?例如每个函数的最小值和最大值?
onStartJob
应该尽快将工作卸载到另一个执行线程。他们提供了SimpleJobService
一个示例,说明您对您的期望。
- Lollipop 没有驱动程序实现
JobScheduler
。还需要处理google play服务不可用的情况,大概应该Driver
基于AlarmManager
.