Android Jetpack WorkManager的使用。设置延时与限制条件

添加依赖

    implementation 'androidx.work:work-runtime:2.7.1'

新建工作类

package com.anguomob.jecpack.work

import android.content.Context
import android.os.SystemClock
import android.util.Log
import androidx.annotation.NonNull
import androidx.work.Worker
import androidx.work.WorkerParameters

class MyWork(val context: Context,val workerParameters: WorkerParameters) : Worker(context,workerParameters) {
    private  val TAG = "MyWork"
    override fun doWork(): Result {
       SystemClock.sleep(2000);
        Log.d(TAG, "MyWork doWork: ")
        return Result.success()
    }
}

页面布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.WorkManagerActivity">

  <Button
      android:id="@+id/button9"
      android:layout_width="145dp"
      android:layout_height="37dp"
      android:text="Button"
      android:onClick="addWork"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

页面代码

package com.anguomob.jecpack.activity

import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.work.Constraints
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import com.anguomob.jecpack.R
import com.anguomob.jecpack.work.MyWork
import java.util.concurrent.TimeUnit

class WorkManagerActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_work_manager)
    }

    fun addWork(view: View) {
        //触发条件
        val constraints = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Constraints.Builder()
                //当网络连接上 可能要过几分钟才可以行
                //        .setRequiredNetworkType(NetworkType.CONNECTED)
                //对网络不强制要求 很快就可以执行
                .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
                //不在电量不足的执行
                .setRequiresBatteryNotLow(true)
                //在充电的时候执行
                .setRequiresCharging(true)
                //不在存储量不足的时候执行
                .setRequiresStorageNotLow(true)
                //在待机状态下执行 需要api级别最低为23
                .setRequiresDeviceIdle(true)
                .build()
        } else {
            Constraints.Builder()
                //当网络连接上 可能要过几分钟才可以行
                //        .setRequiredNetworkType(NetworkType.CONNECTED)
                //对网络不强制要求 很快就可以执行
                .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
                //不在电量不足的执行
                .setRequiresBatteryNotLow(true)
                //在充电的时候执行
                .setRequiresCharging(true)
                //不在存储量不足的时候执行
                .setRequiresStorageNotLow(true)
                .build()
        }
        //不计费网络 如wifi
//        NetworkType.UNMETERED
        //非漫游
//        NetworkType.NOT_ROAMING
        //计费网络 如3g 4g
//        NetworkType.METERED

        //配置任务
        // 一次性执行的任务
        val build = OneTimeWorkRequest.Builder(MyWork::class.java)
            //设置触发条件
            .setConstraints(constraints)
            //设置延迟5s后执行
            .setInitialDelay(5, TimeUnit.SECONDS)
//                //指数退避策略
//            .setBackoffCriteria()
            .build();
        //任务提交给WorkManager
        val workManager = WorkManager.getInstance(this);
        //将任务添加到队列当中
        workManager.enqueue(build)
    }
}

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/124938642