Android Jetpack系列---WorkManager

使用 WorkManager可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任务,旨在用于可延迟运行(即不需要立即运行)并且在应用退出或设备重启时必须能够可靠运行的任务

它和一个异步任务以及 Service 有什么区别呢?那就讲讲它的特性吧: (1)环境约束:WorkManager
允许我们指定任务执行的环境,比如网络已连接、电量充足时等,在满足条件的情况下任务才会执行
(2)拥有强大的生命力:一旦发起一个任务,任务是可以保证一定会被执行的,就算退出应用,甚至重启手机都阻止不了,当应用正在运行时,它会在当前的进程中启用一个子线程执行。应用没有运行时,它则会自己选择一种合适的方式在后台运行。具体是什么方式和
Android 的版本和依赖环境有关 (3)定时任务:OneTimeWorkRequest 是指任务只需要执行一遍,而
PeriodicWorkRequest
则可以发起一个多次执行的定时任务,定时任务并不是说经过指定时间后它就马上执行,而是经过这一段时间后,等到满足约束条件等情况时,它才执行
(4)任务链:WorkManager 允许我们按照一定的顺序执行任务
看到这里,可能你会觉得好像可以实现保活,告诉你,不可能,要是上面有细看的话,你应该已经发现这几点了:
1.定时任务有最小间隔时间的限制,是 15 分钟
2.只有程序运行时,任务才会得到执行
3.无法拉起 Activity

添加如下依赖:

    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"

创建后台任务,如果您需要让 WorkManager 重新尝试执行您的任务,可以从工作器返回 Result.retry()

class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    
    

    override fun doWork(): Result {
    
    
        for (i in 1..3) {
    
    
            Thread.sleep(300)
            Log.i("jay", "data: ${inputData.getString("data")}")
        }
        return Result.success()
    }
}

可以向工作添加约束,以指明工作何时可以运行

        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresBatteryNotLow(false)
            .setRequiresCharging(false)
            .setRequiresDeviceIdle(false)
            .setRequiresStorageNotLow(false)
            .build()
        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(constraints)
            .build()
        WorkManager.getInstance(this).enqueue(request)

如果您的工作没有约束,或者工作加入队列时所有约束均已得到满足,则系统可能会选择立即运行任务。如果您不希望任务立即运行,则可以将工作指定为在经过一段最短初始延迟时间后再启动

        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setInitialDelay(1, TimeUnit.MINUTES) //至少经过1分钟再运行
            .build()
        WorkManager.getInstance(this).enqueue(request)

或许有时需要数据以输入参数的形式传入,或者将数据返回为结果

        val data= workDataOf("data" to "walking pig's hoof")
        val request = OneTimeWorkRequestBuilder<MyWorker>()
            .setInputData(data)
            .build()
        WorkManager.getInstance(this).enqueue(request)
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    
    

    override fun doWork(): Result {
    
    
        for (i in 1..3) {
    
    
            Thread.sleep(300)
            Log.i("jay", "输入的数据: ${inputData.getString("data")}")
        }
        val outputData = workDataOf("workerData" to "行走的猪蹄")
        return Result.success(outputData)
    }
}

Unique Work可以适用于一次性工作和定期工作,通过调用这些方法来创建唯一的工作序列,具体取决于您是计划重复工作还是一次性工作
WorkManager.enqueueUniqueWork() 一次性工作
WorkManager.enqueueUniquePeriodicWork() 定期工作
这两种方法都接受3个参数:
uniqueWorkName:用于唯一标识工作请求的字符串
existingWorkPolicy:冲突解决策略,告诉WorkManager如果已经有一个具有该唯一名称的未完成的工作链该怎么做, 其中包括REPLACE,KEEP和APPEND
work:要安排的工作请求

        val sendLogsWorkRequest =
            PeriodicWorkRequestBuilder<MyWorker>(24, TimeUnit.HOURS)
                .setConstraints(
                    Constraints.Builder()
                        .setRequiresCharging(true)
                        .build()
                )
                .build()
        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "sendLogs",
            ExistingPeriodicWorkPolicy.KEEP,
            sendLogsWorkRequest
        )

猜你喜欢

转载自blog.csdn.net/qq_45485851/article/details/108770049