背景
谷歌有多种作业/任务调度解决方案,如JobScheduler
和GcmTaskService
。每个人都有自己的优点和缺点。
最近,谷歌推出了一个名为"FirebaseJobDispatcher"的新库。
问题
遗憾的是,关于这个新的API,几乎没有什么可读的。事实上,很难找到任何关于它的信息
我只找到了他们的公告视频和一个样本。但即使是他们,对这个API也没有太多的了解。
问题
看看之前的问题、调查和与其他API的比较(例如这里),我想问一下新的API是如何工作的,并知道在使用它时要考虑什么:
-
作业是否可以保留参数,甚至可以在需要时进行修改?他们在示例中说">用户提供的附加组件的可选捆绑包。默认为空捆绑包。"是这样吗?作业在执行时可以修改它吗?
-
作业可以很容易地重新安排吗?据说">一个布尔值,指示作业是否应重复"。如何选择何时重新安排?我尝试过这个示例,并选择了"递归",但它似乎不会再次运行,只有一次。
-
相对于库的作业(因为有唯一的id),它能得到保护吗?
-
它在更新应用程序时需要格外小心吗(就像以前的API一样)?应用程序更新后,是否仍可以安排作业?通过对样本的测试,在应用程序更新后,作业似乎完全消失了。可以避免吗?
-
它是否需要
RECEIVE_BOOT_COMPLETED
,以防我希望即使重新启动设备也能安排作业?样品似乎有。 -
是否可以获得所有计划作业及其信息(包括参数)的列表,并能够取消特定/所有作业,甚至修改它们?
-
在清除应用程序的数据操作后,作业会被删除吗?
-
是否可以告诉作业,它最好在一定的时间内运行(例如:早上7:00到8:00之间)?其中提到"ExecutionWindowTrigger,它指定了一个执行作业的时间窗口"。就是这样吗?当它错过这个窗口时会发生什么?
-
JobService
类中的方法onStartJob
返回一个布尔值,其描述为">是否还有更多的工作要做。"这意味着什么?jobFinished
方法的needsReschedule
参数是什么意思?他们彼此有亲戚关系吗? -
有什么限制我应该知道吗?例如最小&每个函数的最大值?
实际上,Firebase Android JobDispatcher是围绕Android上的作业调度引擎的一层抽象。目前,他们只有一个用于GCM Network Manager的驱动程序实现。这意味着目前它的行为方式与GCM Network Manager的行为方式相同。希望在未来能实施更多的驱动程序。
1.作业是否可以保留参数,甚至可以在需要时进行修改?他们在示例中说"用户提供的附加组件的可选捆绑包。默认为空捆绑包。"。是这样吗?作业在执行时可以修改它吗
- 是的,
Job.Builder
具有具有任意束的方法setExtras
,该方法稍后可以通过jobParameters.getExtras()
访问。您不能修改bundle(jobParameters
只包含getter)。您可以使用标志setReplaceCurrent(true)
重新安排您的作业,并指定一个新的捆绑包
2.作业可以轻松地重新安排吗?它被称为"指示作业是否应该重复的布尔值"。如何选择何时重新安排?我尝试过这个示例,并选择了"递归",但它似乎不会再次运行,只有一次
- 若要重新安排作业,需要指定
setRecurring(true)
、setTrigger(Trigger.executionWindow(10, 20))
一旦窗口开始截止日期为已达到,并且鼓励驾驶员在窗口之前运行作业如果可能的话结束。
3.相对于库的作业,它是否可以受到保护(因为有唯一的id)
-
作业标签在应用程序中必须是唯一的。手机上的其他应用程序都有自己的"端点"(程序包名称/服务名称)。要查看
GooglePlayDriver
的所有计划/已完成作业,请使用adb shell dumpsys activity service GcmService
4.在更新应用程序时是否需要格外小心(就像以前的API一样)?应用程序更新后,是否仍可以安排作业?通过对样本的测试,在应用程序更新后,作业似乎完全消失了。可以避免吗
- 至于GCM Network Manager,
GooglePlayDriver
不会在Google Play Services或应用程序更新后重新安排作业。这是一个悬而未决的问题。所以现在这是你的责任
5.如果我希望即使在设备重新启动时仍安排作业,是否需要RECEIVE_BOOT_COMPLED?样品似乎有。
- 是的,您需要这样的权限。生成器有一个参数来控制行为:
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
当然,如果你要创建自己的驱动程序,你必须自己照顾好自己的一生
6.是否可以获得所有计划作业及其信息(包括参数)的列表,并能够取消特定/所有作业,甚至修改它们
- 否,与GCM Network Manager相同。但你可以自己跟踪所有的工作,同时安排他们玩服务
7.应用程序的清除数据操作后,作业会被删除吗
- 是的,该作业将被删除。可能在之前版本的谷歌播放服务中,它的表现有所不同
8.是否可以告诉作业,它最好在一段时间内运行(例如:早上7:00到8:00之间)?其中提到"ExecutionWindowTrigger,它指定了应在其中执行作业的时间窗口"。就是这样吗?当它错过这个窗口时会发生什么
- 好吧,你可以设置一个在7:00触发的警报,并用
executionWindow(0, 60*60)
安排一个非重复性作业。作业将在7:00到8:00之间运行。
您不能使用定期作业,因为windowStart-作业应在被认为有资格参选。从计划作业的时间开始计算(对于新作业)或上次运行(对于重复作业)。
此外,ExecutionWindowTrigger指定近似时间。不能保证它会在给定的窗口运行。如果它错过了窗口,作业将在以后的任何时间运行。
9."JobService"类中的方法"onStartJob"返回一个布尔值,其描述为"是否还有更多的工作要做"。这是什么意思?"jobFinished"方法的"needsSchedule"参数是什么意思?他们彼此有亲戚关系吗
- 如果
onStartJob
返回false,则表示您已完成工作。无需调用jobFinished
。RESULT_SUCCESS
是自动发送的
如果onStartJob
返回true,则意味着您启动了一个线程并等待结果。一旦你完成了,你必须调用jobFinished
来通知谷歌播放服务是否应该重新安排工作。如果是,将根据RetryStrategy
重新安排作业。
10.我应该知道哪些限制吗?例如最小&每个函数的最大值
-
onStartJob
应尽快将工作卸载到另一个执行线程。他们提供了一个SimpleJobService
作为对您期望的示例- Lollipop的
JobScheduler
没有驱动程序实现。还需要处理google play服务不可用的情况,我们可能应该在AlarmManager
的基础上实现Driver