首页 > 代码库 > 智能作业调度
智能作业调度
**本文章为官方文档译文,如果错误,请指正**
智能作业调度
现代应用程序可以在用户交互的直接流程之外异步执行其许多任务。这个异步任务的一些例子是:
- 更新网络资源
- 下载信息
- 更新后台任务
- 安排调用系统服务
智能调度这些工作可以提高应用程序的性能,以及系统健康方面,例如电池寿命。JobScheduler为你做这个调度工作。
有一些API你可以使用以调度后台工作。这些选项中的主要职责是 JobScheduler。JobScheduler API允许你指定执行任务的稳定条件,以及整个设备的集中式任务调度,已获得最佳的系统运行状态。JobScheduler也提供高度可扩展的功能:它适用于像清楚缓存等这样的小的功能,也使用于像同步数据库到云端这样的大功能。
除了JobScheduler,还有其它一些机制可以帮助你的程序调度工作。他们包括:
- AlarmManager
- Firebase JobDispatcher
- SyncAdapter
- Additional Facilities
此页简单介绍了JobScheduler和其它一些API,它们能帮助应用程序调度工作,以最大化程序性能和系统运行状态。
Android框架JobScheduler
JobScheduler是Android框架API,以实现调度任务或者工作。JobScheduler在Android5.0(API层级21)第一次引入,并且保持积极发展。尤其,Android7.0(API级别24)增加了基于ContentProvider改变来触发作业的功能。
JobScheduler在平台中实现,它可以收集有关需要在所有程序中运行的作业信息。该信息在同一时间或者差不多时间用于作业调度。以这种方式执行分批作业,允许设备进入并保持更长的休眠状体,保持电池寿命。
你可以通过注册作业来使用JobScheduler,并制定他们对于网络和时间的要求。然后,系统在适合的时间优雅的调度执行作业。同时,如果需要,它也遵循Doze and App Standby限制来推迟作业执行。JobScheduler提供很多方法来定义作业执行条件。
假如你的应用程序目标为Android5.0(API层级21),我们建议你使用JobScheduler去执行后台任务。更多信息关于JobScheduler,请参考其API参考文章。
AlarmManager
AlarmManager是系统提供的另外一种调度任务的选择。如果应用程序需要发送通知或者设置闹铃,此时该API非常有用。
你应该仅仅当必须在特定时间执行任务的时候才使用该API,但不要求像JobScheduler允许你指定其它更加强大的执行条件,例如设备空闲和充电检查。
Firebase JobDispatcher
Firebase JobDispatcher是一个开源库,提供类似于Android平台中JobScheduler的API。Firebase JobDispatcher作业针对Android版本低于5.0(API层级21)应用程序的JobScheduler兼容性层。
Firebase JobDispatcher支持用户使用Google Play服务作为调度(运行)作业的实现,同时这个库也允许你定义和使用其它的实现:例如,你可能决定使用JobScheduler或者编写自定义自己的代码。因为这些多功能性,我们建议你使用Firebase JobDispatcher,假如你的APP目标Android版本是低于5.0的(API层级21)。
更多关于Firebase JobDispatcher,请参考其文档和源代码。
附加工具
除了上述API和库之外,还有同步适配器和服务,可以帮助你的应用程序在特定条件下更好,更强壮的运行。
SyncAdapter
该框架继续提供了SyncAdapter类以管理在设置和服务器之间同步数据的任务。同步适配器是特别为在设备和云端同步数据设计的,你应该仅仅只在此种任务中使用它们。同步适配器比上面提到的库和API有更加复杂的实现,因为它至少需要一个伪造的authenticator和content provider实现。因为这个原因,一般不应该创建同步适配器仅仅为了在后台同步数据到云端。你应该尽可能的使用JobScheduler,Firebase JobDispatcher或者GCM Network Manager替代。
在Android N(API层级24),SyncManager在JobScheduler之上。如果需要其提供的附加功能,则只应使用SyncAdapter类。
Services
服务框架允许你在后台执行长时间运行的操作。我们建议使用前台服务执行那些需要为用户驻留的任务,例如播放音乐。绑定服务还可以用于各种情况,例如,仅当用户在一个fragment或者activity的页面时才需要运行服务。
你应该避免为那些无限制时间或者周期性任务开始的服务,因为他们持续使用设备资源即使当他们不再执行任务的时候。相反,你应该使用该页面描述的其它解决方案,并提供本机生命周期管理。开始使用服务仅仅作为最后的手段。Android平台可能在将来不再支持服务。
附加点
无论你采用何种解决方案,请记住以下几点:
- 互联网门户网站,VPN和代理会造成互联网连接检测问题。一个库或者API可能认为网络可用,但是你的服务可能无法访问。正常失败,并尽可能少的重新安排任务。
- 根据你为运行任务分配的条件,例如网络可用,在任务触发之后,可能会发生改变,以便不在满足该条件。在这种条件下,你的操作可能失败并且重复出现。因此,你应该编写后台逻辑任务,以注意任务的持续失败,并执行指数退避以避免无意中资源的过度使用。
- 请记住使用指数退避当重复安排任何工作的时候,尤其在使用AlarmManager的时候。假如你的应用程序使用了JobScheduler,Firebase JobDispatcher或者同步适配器,则会自动使用指数退避。
智能作业调度