WorkManager是Android Jetpack的架构组件(Architecture component)之一,官方对它的定义是用来管理Android后台作业。
简单上手
1,添加依赖
1 | // 在app的build.gradle里添加 |
2,实现一个Worker
1 | // 相当于一个Task |
3,创建一个WorkRequest
1 | // 定义怎么运行Worker,下面这个worker将只运行一次,对应的还有周期运行的PeriodicWorkRequestBuilder |
4,执行Worker
1 | // 调用WorkManager单例开始worker |
WorkerManager作为JetPack一员,官方强烈安利搭配LiveData
and ViewModel
一起食用。不过单独用也完全OK,而且上手是很简单的。执行后台任务我们已经有AsyncTask,ThreadPools,RxJava…那WorkManager需要足够理由来说服大家上车。
WorkManager是啥?
WorkManager可以用来轻松安排非立即执行的异步任务,即使程序退出或者手机重启。
关键功能
- 支持API 14以上机型,在API 14-22使用BroadcastReceiver + AlarmManager,23+则是JobScheduler
- 给work添加触发条件,比如特定网络状态和或电池多少以上才执行
- 可以单次或周期的执行异步任务
- 监视和管理任务
- 按组按序执行任务
- 可以确保任务执行,即使app退出或手机重启,叼
- 电池友好,即使休眠模式也能工作
使用场景
- 发送logs或analytics给后端
- 周期性和后端同步app数据
什么时候用
敲黑板:是否需要立即执行的前提很重要,比如用户希望立即运行不被打断,那WorkManager就表示做不到了,这时需要用foreground service。其他情况下首选WorkManager,它具有更高的兼容性和更优雅的封装性。
进阶使用
1,传递数据
1 | //IN: requestBuilder 往worker塞数据 |
2,监听worker执行状态
1 | // 实例化一个workRequestBuilder |
3,串并联worker,S队形B队形随意排
1 | * A |
4,Cancelling and stopping work
1 | WorkManager.cancelWorkById(workRequest.id) |
5,周期任务
1 | // 充电时worker才工作 |
6,WorkManager的线程模型
1 | // 简单来说就是三种,本文最开头的添加依赖里标了A,B,C |
参考
https://developer.android.com/topic/libraries/architecture/workmanager
https://codelabs.developers.google.com/codelabs/android-workmanager-kt/#0
https://medium.com/androiddevelopers/introducing-workmanager-2083bcfc4712