android alarmmanager 后台收不到_Android源码解析-WorkManager

1 引言WorkManager是Android Jetpack的一个库,可以在达到约束条件的情况下执行可延期的有保证性的后台任务,适用于即便在应用退出后也要能保证运行的工作任务,是后台任务框架的优秀解决方案。WorkManager又不完全是一个全新的后台任务框架,它的底层依然使用了Android之前的API,会根据设备的版本去选择调用调用JobScheduler或者Firebase JobDisp...
摘要由CSDN通过智能技术生成

27f33965-3c30-eb11-8da9-e4434bdf6706.png

1 引言

WorkManager是Android Jetpack的一个库,可以在达到约束条件的情况下执行可延期的有保证性的后台任务,适用于即便在应用退出后也要能保证运行的工作任务,是后台任务框架的优秀解决方案。

WorkManager又不完全是一个全新的后台任务框架,它的底层依然使用了Android之前的API,会根据设备的版本去选择调用调用JobScheduler或者Firebase JobDispatcher,或者AlarmManager来执行任务。上层封装了一致性API,让开发者不用再为设备版本不同去考虑不同的后台任务方案。

29f33965-3c30-eb11-8da9-e4434bdf6706.png

除此之外,WorkManager还具备很多优点: 工作约束 强大的调度 灵活的重试策略 任务链接,按照需要依次执行 * 内置线程互操作性,无缝集成RxJava和协程

具体介绍查看官方文档

2 使用

开始使用WorkManager前,先添加如下依赖,WorkManager支持Java和kotlin,同时还增加了对协程和RxJava的支持。

dependencies {
  def work_version = "2.4.0"

    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"

    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"
  }

2.1 定义任务Worker

首先先要定义一个执行任务,这里定义一个循环执行上传图片的任务。

import androidx.work.Worker
import androidx.work.WorkerParameters

class UploadWorker(
    val context: Context, workerParams: WorkerParameters
) : Worker(context, workerParams) {
    
    override fun doWork(): Result {
    
        uploadImg()
        return Result.success();
    }

    fun uploadImg() {
    
        while (true) {
    
            // 模拟上传耗时
            Thread.sleep(1000)
            Log.d("workermanager", "uploadImg...")
        }
    }
}

定义一个任务都需要继承WorkManager的抽象类Worker,并且重写doWork()方法,这里是你要执行的操作代码,doWork()返回的 Result 会通知 WorkManager 服务工作是否成功,以及工作失败时是否应重试工作,有三种: Result.success() 任务执行成功 Result.failure() 任务执行失败 * Result.retry() 任务执行失败,按照重试策略进行重试

2.2 创建WorkRequest

// 单次任务
val req1: WorkRequest = OneTimeWorkRequest.from(UploadWorker::class.java)

// 周期任务,最短间隔15分钟
val req2 = PeriodicWorkRequestBuilder<UploadWorker>(15, TimeUnit.MINUTES).build()

// 增加约束,仅在用户设备正在充电且连接到 Wi-Fi 网络时才会运行
val constraints = Constraints.Builder()
   .setRequiredNetworkType(NetworkType.UNMETERED)
   .setRequiresCharging(true)
   .build()

val req3: WorkRequest = OneTimeWorkRequestBuilder<MyWork>()
        .setInitialDelay(10, TimeUnit.MINUTES) // 延迟10分钟
        .setConstraints(constraints)
        .build()

还有更多的创建WorkRequest也可以查阅官方文档,这里只给出最简单的例子,抓住主线,为后面解析代码做准备。

2.3 执行WorkRequest

WorkManager.getInstance(mContext).enqueue(request)
// 执行唯一任务
WorkManager.getInstance(mContext).enqueueUniqueWork(uniqueWorkName,existingWorkPolicy,request)
// 定期执行唯一任务
WorkManager.getInstance(mContext).enqueueUniquePeriodicWork(uniqueWorkName,existingWorkPolicy,request)

3 源码解析

上面介绍了一个最简单的从创建任务到执行的过程,下面就沿着这条主线来分析源代码。

3.1 Worker

一次性Worker的生命周期如图所示:

2af33965-3c30-eb11-8da9-e4434bdf6706.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值