IT评测·应用市场-qidao123.com

标题: Android中WorkManager的简单使用 [打印本页]

作者: 南七星之家    时间: 2025-3-13 08:14
标题: Android中WorkManager的简单使用
Android中WorkManager的简单使用

1.简介:

WorkManager:

WorkManager是Google推出的一个新组件,用于替换传统的Service举行背景任务处理。它的主要特点包括:

2.简单任务:

  1. /**
  2. * @auth: njb
  3. * @date: 2024/11/26 23:14
  4. * @desc: 简单任务
  5. */
  6. class MainWorker(context: Context, workerParams: WorkerParameters): Worker(context, workerParams) {
  7.     override fun doWork(): Result {
  8.         Log.e(Constants.TAG,"简单任务 执行完毕"+Result.success())
  9.         return Result.success()
  10.     }
  11. }
复制代码
3.周期性任务:

  1. /**
  2. * @auth: njb
  3. * @date: 2024/11/26 23:34
  4. * @desc: 周期性任务
  5. */
  6. class PeriodicWork(context: Context, workerParams: WorkerParameters) :
  7.     Worker(context, workerParams) {
  8.     override fun doWork(): Result {
  9.         Log.e(Constants.TAG,"周期性任务 执行完毕")
  10.         return Result.success()
  11.     }
  12. }
复制代码
4.通报数据:

  1. package com.cloud.workmanagerdemo
  2. import android.content.Context
  3. import android.util.Log
  4. import androidx.work.Data
  5. import androidx.work.Worker
  6. import androidx.work.WorkerParameters
  7. /**
  8. * @auth: njb
  9. * @date: 2024/11/26 23:38
  10. * @desc: 传达数据
  11. */
  12. class TransferDataWork(context: Context, workerParams: WorkerParameters) :
  13.     Worker(context, workerParams) {
  14.     override fun doWork(): Result {
  15.         val activityData = inputData.getString("data")
  16.         Log.e(Constants.TAG,"传递数据任务 $activityData ")
  17.         val data = Data.Builder()
  18.             .putString("data", "TransferDataWork的数据").build()
  19.         return Result.success(data)
  20.     }
  21. }
复制代码
5.任务链:

  1. package com.cloud.workmanagerdemo
  2. import android.content.Context
  3. import android.util.Log
  4. import androidx.work.Worker
  5. import androidx.work.WorkerParameters
  6. /**
  7. * @auth: njb
  8. * @date: 2024/11/26 23:38
  9. * @desc: 任务链WorkManager
  10. */
  11. class DisPatchWork(context: Context, workerParams: WorkerParameters) :
  12.     Worker(context, workerParams) {
  13.     override fun doWork(): Result {
  14.         val activityData = inputData.getString("data")
  15.         Log.e(Constants.TAG, "任务链$activityData")
  16.         return Result.success()
  17.     }
  18. }
复制代码
6.主界面代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     tools:context=".MainActivity">
  9.     <TextView
  10.         android:id="@+id/tv_main"
  11.         android:layout_width="200dp"
  12.         android:layout_height="40dp"
  13.         android:text="简单任务"
  14.         android:textColor="@color/white"
  15.         android:textSize="20sp"
  16.         android:onClick="mainWork"
  17.         android:gravity="center"
  18.         android:background="@color/design_default_color_primary"
  19.         app:layout_constraintEnd_toEndOf="parent"
  20.         app:layout_constraintStart_toStartOf="parent"
  21.         app:layout_constraintTop_toTopOf="parent"
  22.         android:layout_marginTop="100dp"/>
  23.     <TextView
  24.         android:id="@+id/tv_data"
  25.         android:layout_width="200dp"
  26.         android:layout_height="40dp"
  27.         android:text="传递数据"
  28.         android:onClick="transferDataWork"
  29.         android:textColor="@color/white"
  30.         android:textSize="20sp"
  31.         android:gravity="center"
  32.         android:layout_marginTop="20dp"
  33.         android:background="@color/design_default_color_primary"
  34.         app:layout_constraintEnd_toEndOf="parent"
  35.         app:layout_constraintStart_toStartOf="parent"
  36.         app:layout_constraintTop_toBottomOf="@+id/tv_main" />
  37.     <TextView
  38.         android:id="@+id/tv_more"
  39.         android:layout_width="200dp"
  40.         android:layout_height="40dp"
  41.         android:text="任务链"
  42.         android:onClick="moreWork"
  43.         android:textColor="@color/white"
  44.         android:textSize="20sp"
  45.         android:gravity="center"
  46.         android:layout_marginTop="20dp"
  47.         android:background="@color/design_default_color_primary"
  48.         app:layout_constraintEnd_toEndOf="parent"
  49.         app:layout_constraintStart_toStartOf="parent"
  50.         app:layout_constraintTop_toBottomOf="@id/tv_data" />
  51.     <TextView
  52.         android:id="@+id/tv_poll"
  53.         android:layout_width="200dp"
  54.         android:layout_height="40dp"
  55.         android:text="周期性任务"
  56.         android:onClick="periodicTask"
  57.         android:textColor="@color/white"
  58.         android:textSize="20sp"
  59.         android:gravity="center"
  60.         android:layout_marginTop="20dp"
  61.         android:background="@color/design_default_color_primary"
  62.         app:layout_constraintEnd_toEndOf="parent"
  63.         app:layout_constraintStart_toStartOf="parent"
  64.         app:layout_constraintTop_toBottomOf="@id/tv_more"/>
  65. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
7.测试代码:

  1. package com.cloud.workmanagerdemo
  2. import android.os.Bundle
  3. import android.util.Log
  4. import android.view.View
  5. import androidx.appcompat.app.AppCompatActivity
  6. import androidx.work.Data
  7. import androidx.work.OneTimeWorkRequest;
  8. import androidx.work.PeriodicWorkRequest;
  9. import androidx.work.WorkManager;
  10. import java.util.concurrent.TimeUnit
  11. class MainActivity : AppCompatActivity() {
  12.     override fun onCreate(savedInstanceState: Bundle?) {
  13.         super.onCreate(savedInstanceState)
  14.         setContentView(R.layout.activity_main)
  15.     }
  16.    fun mainWork(view: View?) {
  17. /*       val constraints = Constraints.Builder()
  18.             .setRequiredNetworkType(NetworkType.CONNECTED)
  19.             .build()
  20.         val dateFormat = SimpleDateFormat("hh:mm:ss", Locale.getDefault())
  21.         val data = Data.Builder()
  22.             .putString("date", dateFormat.format(Date()))
  23.             .build()
  24.         val oneTimeWorkRequest = OneTimeWorkRequest
  25.             .Builder(MainWorker::class.java)
  26.             .setConstraints(constraints)
  27.             .setInputData(data)
  28.             .build()
  29.         WorkManager.getInstance(this@MainActivity).enqueue(oneTimeWorkRequest)
  30.         WorkManager.getInstance(this)
  31.             .getWorkInfoByIdLiveData(oneTimeWorkRequest.id)
  32.             .observe(this) { workInfo ->
  33.                 workInfo?.let {
  34.                     if(it.state.isFinished){
  35.                         val outputData = workInfo.outputData
  36.                         Log.e("传递数据任务", outputData.getString("data")!!)
  37.                     }
  38.                 }
  39.             }*/
  40.         val oneTimeWorkRequest: OneTimeWorkRequest =
  41.             OneTimeWorkRequest.Builder(MainWorker::class.java)
  42.                 .setInitialDelay(2, TimeUnit.SECONDS)
  43.                 .build()
  44.         WorkManager.getInstance(this).enqueue(oneTimeWorkRequest)
  45.     }
  46.     fun transferDataWork(view: View?) {
  47.         val data = Data.Builder()
  48.             .putString("data", "Activity的数据").build()
  49.         val oneTimeWorkRequest: OneTimeWorkRequest = OneTimeWorkRequest.Builder(TransferDataWork::class.java)
  50.                 .setInputData(data)
  51.                 .build()
  52.         WorkManager.getInstance(this).enqueue(oneTimeWorkRequest)
  53.         //监听Worker回传的数据
  54.         WorkManager.getInstance(this)
  55.             .getWorkInfoByIdLiveData(oneTimeWorkRequest.id)
  56.             .observe(this) { value ->
  57.                 if (value.state.isFinished) {
  58.                     val outputData = value.outputData
  59.                     Log.e("传递数据任务", outputData.getString("data")!!)
  60.                 }
  61.             }
  62.     }
  63.     /**
  64.      * 任务链
  65.      * @param view
  66.      */
  67.     fun moreWork(view: View?) {
  68.         val workerRequests: ArrayList<OneTimeWorkRequest> = ArrayList()
  69.         //任务1
  70.         val oneTimeWorkRequest1: OneTimeWorkRequest =
  71.             OneTimeWorkRequest.Builder(DisPatchWork::class.java)
  72.                 .setInputData(Data.Builder().putString("data", "任务1").build())
  73.                 .build()
  74.         //任务2
  75.         val oneTimeWorkRequest2: OneTimeWorkRequest =
  76.             OneTimeWorkRequest.Builder(DisPatchWork::class.java)
  77.                 .setInputData(Data.Builder().putString("data", "任务2").build())
  78.                 .build()
  79.         workerRequests.add(oneTimeWorkRequest1)
  80.         workerRequests.add(oneTimeWorkRequest2)
  81.         //任务3
  82.         val oneTimeWorkRequest3: OneTimeWorkRequest =
  83.             OneTimeWorkRequest.Builder(DisPatchWork::class.java)
  84.                 .setInputData(Data.Builder().putString("data", "任务3").build())
  85.                 .build()
  86.         WorkManager.getInstance(this)
  87.             .beginWith(workerRequests) //先执行的任务
  88.             .then(oneTimeWorkRequest3) //后执行的任务
  89.             .enqueue()
  90.     }
  91.     /**
  92.      * 周期性任务
  93.      * @param view
  94.      */
  95.     fun periodicTask(view: View?) {
  96.         val periodicWorkRequest: PeriodicWorkRequest =
  97.             PeriodicWorkRequest.Builder(PeriodicWork::class.java, 15, TimeUnit.MINUTES)
  98.                 .build()
  99.         WorkManager.getInstance(this)
  100.             .enqueue(periodicWorkRequest)
  101.     }
  102. }
复制代码
8.日记打印:


9.实现效果如下:


10.使用场景:


11.总结:

Service和WorkManager各有优缺点,选择使用哪一个取决于详细的需求场景。如果必要依靠应用内部运行的背景任务,且任务不涉及耗时利用,可以选择Service;如果必要延迟实行或应用退出后仍需运行的任务,且盼望减少开辟工作量,可以选择WorkManager。
12.背景任务选择:

场景推荐需系统触发,不必完成ThreadPool + Broadcast需系统触发,必须完成,可推迟WorkManager需系统触发,必须完成,立即ForegroundService + Broadcast不需系统触发,不必完成ThreadPool不需系统触发,必须完成,可推迟WorkManager不需系统触发,必须完成,立即ForegroundService 13.项目demo代码:

https://gitee.com/jackning_admin/work-manager-demo

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4