首页 > 代码库 > 智能作业调度

智能作业调度

**本文章为官方文档译文,如果错误,请指正**

智能作业调度

  现代应用程序可以在用户交互的直接流程之外异步执行其许多任务。这个异步任务的一些例子是:

  • 更新网络资源
  • 下载信息
  • 更新后台任务
  • 安排调用系统服务

  智能调度这些工作可以提高应用程序的性能,以及系统健康方面,例如电池寿命。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或者同步适配器,则会自动使用指数退避。

 

智能作业调度