Android官方文档链接:Intelligent Job-Scheduling
随着需求和业务的发展,越来越多的apps需要去异步执行各种各样的任务,有些任务是用户去执行的,而有些任务则是apps自身需要去执行,这些任务的使用场景有如下示例:
更新网络资源
下载信息
更新后台任务
处理系统服务的回调
如何智能化的去处理这项工作,是至关重要的,如果处理方式得当的话,不仅可以提高你的应用性能,还可以减轻系统的压力,例如通过减少你的应用耗电量,来达到省电的效果。
于是,针对这一需求,JobScheduler应运而生。
目前Android系统已经提供了几种APIs来让你的app安排后台任务,但是我们建议优先选择JobScheduler ,因为JobScheduler API不仅可以选择一个合适的时机去执行任务,提高app和系统的性能。.JobScheduler还具有高度的扩展性和适用性。你可以通过它来执行一个简单的任务,如清除缓存,也可以通过它来执行复杂的任务,如同步你的数据库到云端。
除了JobScheduler ,还有其他一些类似的APIs去帮助安排你的工作计划,它们包括:
本篇文章简要介绍了JobScheduler和其他API,可以帮助你的应用程序优雅的去安排你的工作计划。
Android Framework JobScheduler
JobScheduler是由Android系统框架所提供,它被用来执行任务或者安排工作计划,目前JobScheduler只能在Android 5.0以上的版本才可以使用,并且一直在不断的完善中,尤其是,在最新的Android N版本中增加了一个新的功能,在ContentProvider
发生改变时触发你的工作计划。
由于JobScheduler是在Android系统框架内实现的,所以当apps选择使用JobScheduler时,它可以通过收集一切有利于安排工作计划和执行任务的有关信息,更好的去完成它的工作。这种方式的批量作业执行允许设备进入和停留在休眠状态更长的时间,保护电池寿命。
通过注册jobs
来使用JobScheduler,并指定它对网络和时间的要求,然后Android系统会优雅地安排工作在适当的时间执行,同时,它也将执行必要的工作在遵循Doze and App Standby的限制前提下,另外,JobScheduler也提供了许多方法来定义工作的执行情况。
如果你的应用程序的目标是Android 5(API Level 21)以上,我们建议您使用JobScheduler执行后台任务。关于JobScheduler的更多信息,见其API参考文档。
AlarmManager
AlarmManager API是Android 系统框架提供的另一种选择,用来安排你的工作计划。它的使用场景,一般是app需要在一个特定的时间发布一个通知或在一个特定的时间内发出一个指示信息。
如果你的需求仅仅是执行在一个特定时间的任务,而不考虑其他方面的话,你可以使用AlarmManager。JobScheduler则更加灵活,你可以指定执行的条件,如设备空闲或者充电的时候。
AlarmManager并不遵循Doze and App Standby 的限制,它在运行任务并没有考虑Doze or App Standby模式。需要注意的是,应用程序如果是运行在Doze or App Standby模式下,是无法使用网络应用程序。
Firebase JobDispatcher
Firebase JobDispatcher是一个开源的库,它和系统框架的JobScheduler非常相似。不过值得一提的是,Firebase JobDispatcher可以兼容Android 5.0以下的版本。
Firebase JobDispatcher支持使用Google Play services的调度去执行(运行)的工作,但这个库也允许您定义和使用其他的实现:例如,你可能会决定使用JobScheduler或自定义。
如果你的应用程序需要兼容Android 5.o以下的版本,我们建议你使用Firebase JobDispatcher。
关于Firebase JobDispatcher的更多信息,参考其文档和源代码。
GCM Network Manager
GCM Network Manager是Android提供一个可以兼容到5.0以下版本的JobScheduler。它具有JobScheduler所有的优势,但是,它依赖于Google Play services,因为是由Google Play services负责所有工作计划的安排和执行,并达到省电的目的。
GCM Network Manager是Firebase JobDispatcher的较早版本。目前GCM Network Manager已经停止更新,我们建议您使用Firebase JobDispatcher。
其他
除了上面所介绍的外,还有SyncAdapter和Services,可以使您的应用程序在特定条件下,更合理的去安排工作计划和执行任务。
SyncAdapter
SyncAdapter类是由系统框架所提供,它的作用是用来管理你的设备和服务器之前的同步任务。Sync adapters相对于以上的几种APIs,有着更为复杂的实现,因为它要求你至少提供authenticator和content provider的实现。因此,如果你只是简单的想在后台同步数据到云端,你应该使用JobScheduler、Firebase JobDispatcher,或者GCM Network Manager来代替。
如果你的需求更贴近于 SyncAdapter的使用场景,那么你应该使用它。
Services
Services允许您在后台运行一段长时间的操作。如果这个操作是需要与用户交互的话,我们建议你将任务放在前台的Services中,如播放音乐。另外,在某些使用场景下,我们建议你将Services绑定在用户需要去使用的那个fragment
或者 activity
中。
在Services中,你应该避免使用那些无限制时间和周期性的任务,因为即便它们并没有执行,也会去耗费系统的资源。相应的,针对这些任务,您应该使用本篇文章所介绍的其他解决方案,并提供与之对应的生命周期管理。所以,针对这些特殊的任务,Services并不是你良好的选择方案。
注意
无论你采用的解决方案,请注意以下几点:
考虑到网络的复杂性,一些互联网门户网站,VPN,和代理可能会有网络连接检测失败的问题。一个库或一个接口可能会认为网络是可用的,但是您的服务可能无法访问。所以,你需要合理的去处理失败的情况,以及重新安排工作计划的执行。
根据您分配的条件来运行一个任务,如在网络正常连接的情况下,任务被触发后,但是如果发生一个更改,使这些条件不再满足。在这种情况下,你的操作可能会失败,或者反复的去执行。基于这个原因,你应该在任务失败的时候通知你的后台任务逻辑,并避免对资源产生一些过度的使用。
如果你使用的是AlarmManager ,在重新安排你的工作计划执行时,需要避免产生一些不必要的冲突。如果你使用的是JobScheduler
, GCM Network Manager, Firebase JobDispatcher, 或者 sync adapters,它们则已经自动处理好这个问题。