探究Jetpack(四)之 WorkManager

WorkManager

WorkManager很适合用于处理一些要求定时执行的任务,它可以根据操作系统的版本自动选择底层是使用AlarmManager实现还是JobScheduler实现,从而降低了的使用成本。另外,它还支持周期性任务、链式任务处理等功能,是一个非常强大的工具
WorkManager和Service并不相同,也没有直接的联系。Service是Android系统的四大组件之一,它在没有被销毁的情况下是一直保持在后台运行的
而WorkManager只是一个处理定时任务的工具,它可以保证即使在应用退出甚至手机重启的情况下,之前注册的任务仍然将会得到执行,因此WorkManager很适合用于执行一些定期和服务器进行交互的任务,比如周期性地同步数据,等等
另外,使用WorkManager注册的周期性任务不能保证一定会准时执行,这并不是bug,而是系统为了减少电量消耗,可能会将触发时间临近的几个任务放在一起执行,这样可以大幅度地减少CPU被唤醒的次数,从而有效延长电池的使用时间

WorkManager的基本用法

要想使用WorkManager,需要先在app/build.gradle文件中添加如下的依赖:

implementation "androidx.work:work-runtime:2.2.0"

WorkManager的基本用法其实非常简单,主要分为以下3步:
(1) 定义一个后台任务,并实现具体的任务逻辑;
(2) 配置该后台任务的运行条件和约束信息,并构建后台任务请求;
(3) 将该后台任务请求传入WorkManager的enqueue()方法中,系统会在合适的时间运行。

第一步要定义一个后台任务,这里创建一个SimpleWorker类,代码如下所示:

class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
	 override fun doWork(): Result {
		 Log.d("SimpleWorker", "do work in SimpleWorker")
		 return Result.success()
	 }
}

后台任务的写法非常固定,也很好理解。首先每一个后台任务都必须继承自Worker类,并调用它唯一的构造函数。然后重写父类中的doWork()方法,在这个方法中编写具体的后台任务逻辑即可
doWork()方法不会运行在主线程当中,因此可以放心地在这里执行耗时逻辑,不过这里简单起见只是打印了一行日志
另外,doWork()方法要求返回一个Result对象,用于表示任务的运行结果,成功就返回Result.success(),失败就返回Result.failure()。除此之外,还有一个Result.retry()方法,它其实也代表着失败,只是可以结合WorkRequest.Builder的setBackoffCriteria()方法来重新执行任务

接下来可以进入第二步,配置该后台任务的运行条件和约束信息
这一步其实也是最复杂的一步,因为可配置的内容非常多,不过目前还只是了解WorkManager的基本用法,因此只进行最基本的配置就可以了,代码如下所示:

val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java).build()

可以看到,只需要把刚才创建的后台任务所对应的Class对象传入OneTimeWorkRequest.Builder的构造函数中,然后调用build()方法即可完成构
OneTimeWorkRequest.Builder是WorkRequest.Builder的子类,用于构建单次运行的
后台任务请求

WorkRequest.Builder还有另外一个子类PeriodicWorkRequest.Builder,可用于构建周期性运行的后台任务请求,但是为了降低设备性能消耗,PeriodicWorkRequest.Builder构造函数中传入的运行周期间隔不能短于15分钟,示例代码如下:

val request = PeriodicWorkRequest.Builder(SimpleWorker::class.java, 15, TimeUnit.MINUTES).build()

最后一步,将构建出的后台任务请求传入WorkManager的enqueue()方法中,系统就会在合适的时间去运行了:

WorkManager.getInstance(context).enqueue(request)

在activity_main.xml中新增一个“Do Work”按钮,然后修改MainActivity中的代码,如下所示:

class MainActivity : AppCompatActivity() {
	 ...
	 override fun onCreate(savedInstanceState: Bundle?) {
		 ...
		 doWorkBtn.setOnClickListener {
			 val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java).build()
			 WorkManager.getInstance(this).enqueue(request)
		 }
	 }
	 ...
}

在“Do Work”按钮的点击事件中构建后台任务请求,并将请求传入WorkManager的enqueue()方法中
后台任务的具体运行时间是由我们所指定的约束以及系统自身的一些优化所决定的,由于这里没有指定任何约束,因此后台任务基本上会在点击按钮之后立刻运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值