Contents
Android Framework JobScheduler 1
智能任务调度
现在的应用程序可以异步执行很多操作,而不需要用户参与。例如:
- 更新网络资源
- 下载
- 后台任务更新
- 调度系统服务呼叫
智能调度任务能够提高性能,同时还能保护电池,降低耗电。JobScheduler负责调度。
有很多API帮你调度后台任务。最主要是JobScheduler。JobScheduler即可以允许你指定各种情况,触发任务,也可以集中在某个时间短执行,降低耗电。JobScheduler可以提供稳健的服务:既适合像清除缓冲这样的小任务,也适合同步数据库到云端。
除了JobScheduler,还有其它的很多API。包括:
- AlarmManager
- Firebase JobDispatcher
- SyncAdapter
- Additional Facilities
注意:WorkManager是一个新API,目前还在alpha阶段,它保证你调度后台任务(不管应用进程是否依然存在)。WorkManager为API14的设备提供像JobScheduler这样的API,即使没有Google Play Services。WorkManager可以查询(可见的),支持流畅的图像任务。如果你正在使用JobScheduler,FireBaaseJobScheduler或者AlarmManager和BroadcastReceivers,应该考虑用WorkManager替换。
这里提供了JobScheduler和其他API的简单使用介绍。
Android Framework JobScheduler
JobScheduler是调度任务的。最早在Android 5.0(API21)中出现,现在依然在开发。注意,Android7.0(API24)添加了监听ContentProvider调度任务的功能。
JobScheduler在平台中实现的,允许收集所有应用的调度信息。这个信息可以使得系统知道在什么时间执行什么调度。批量处理调度可以使得设备更长时间处于睡眠状态从而省电。
通过JobScheduler注册任务,指定他的触发需求,比如联网或时间。系统会很好的调度他们。同时,在Doze或者应用待机状态延迟任务调度。JobScheduler提供了很多方法让你指定任务触发方法。
如果你的系统运行在Android5.0(API21)以上,强烈建议你使用JobScheduler。
AlarmManager
AlarmManager也是系统提供的一个调度API。他主要用在应用需要发出通知或者需要启动一个特定的闹钟时。
使用AlarmManager,触发条件应该仅限特定时间执行,不应该制定其他条件,像设备空闲,检测 到充电,等。
Firebase JobDispatcher
Firebase JobDispatcher是Android系统提供的类似于JobScheduler的API。Firebase JobDispatcher为低于Android5.0系统的设备提供了JobScheduler兼容层。
Firebase JobDispatcher支持使用Google Play作为调度实现。如果你想自己实现JobScheduler的功能,可以在Firebase JobDispatcher的基础上实现,但这毕竟属于特殊的情况,但如果你的系统运行在Android5.0以下的版本,强烈建议你使用Firebase Dispatcher。
其他功能
除了上面的API和库,还有sync adapter和服务,在某些特殊的时候使用,为系统提供了更加丰富的功能。
SyncAdapter
提供依然提供SyncAdapter的功能来管理设备和服务器之间的数据同步。Sync adapter专门用于设备和云端进行数据同步。Sync Adapter跟其他的API和库相比复杂些,因为他至少需要一个假的authenticator和一个实现好的ContentProvider。由于这些原因,如果只需要在后台与服务器同步,不建议使用SyncAdapter。尽可能的使用JobScheduler,Firebase JobDispatcher或GCM Network Manager。
在Android N(API24),SyncManager在JobScheduler的上层,除非使用SyncManager提供的特殊的功能,尽量不用这个API。
Services
Service允许你指定在后台长期运行的任务。我们建议使用前台任务,用户一直可以看到并操作,像播放音乐。Bound服务仍然在用,例如:用户打开某个Activity或者Fragment时候绑定服务做一些事情。
应该避免使用start服务或者让服务周期性执行任务,因为这样即使不在执行任务了,他依然在消耗资源。应该尽量使用本文描述的其他的API,最后在考虑使用start 服务,将来start服务的功能可能会不再支持。
最佳实践
不管你选择哪个方案,记住以下几点:
- 获得网络端口,VPN和代理可能会发现网络问题。但是API和库会认为网络是可达的,合理处理这种情况,给用户友好的界面。同时尽可能少的重新调度。
- 基于你的设定的条件调度任务,但是当调度开始执行时,条件可能已经不满足了,合理处理这些。并且在你的任务处理中,要有发现任务持续失败的代码,然后作出处理,使用指数后退机制重新调度。
- 记住使用指数后退机制重新调度任务,尤其是AlarmManager。如果你用的是JobScheduler,Firebase JobDispatcher或者Sync adapter,指数调度是自动执行的。