使用Workmanager在Android中掌握背景处理:有效背景处理指南
#发展 #java #kotlin #android

介绍

在移动应用程序开发的世界中,有效执行背景任务对于提供流畅的用户体验至关重要。 Android提供了用于背景处理的各种API,但是推荐的持续工作解决方案是工人。 Workmanager的一部分是Android JetPack,为计划在后台运行的任务提供了简化且一致的API,即使在应用程序重新启动和系统重新启动中也需要运行。

在这篇博客文章中,我们将探索工人的力量,并学习如何安排不同类型的任务,定义工作约束,处理工作链接并与其他线程框架集成。我们还将讨论使用Workmanager进行可靠的工作的好处,以及它如何替代诸如FirebaseJobdisPatcher,GCMNETWorkManager和Job Scheduler等不弃用的API。

1.持续工作的类型

Workmanager处理三种类型的持续工作:

即时

即时任务应立即开始执行并尽快完成。在需要优先级的情况下,也可以加快它们。

长期运行

长期运行的任务是可能持续更长的时间,可能超过10分钟的任务。这些任务可以安排一次或定期运行。

延期

可推迟的任务计划在以后的时间开始,并且也可以定期运行。他们根据特定时间间隔或条件提供了执行任务的灵活性。

2.工人的功能

Workmanager提供了几个关键功能,使其成为背景处理的强大工具:

工作限制

声明地定义了使用工作限制的工作的最佳条件。例如,您可以指定任务只有在设备在未计量网络上,设备空闲或具有足够电池时运行。

健壮的安排

Workmanager允许您安排工作以进行一次运行或反复使用灵活的调度窗口。您可以标记并命名工作以安排独特的,可更换的任务,并监视或取消工作组。

加快工作

您可以使用Workmanager安排立即工作以在后台执行。加急工作对于对用户很重要并在几分钟内完成的任务很有用。

灵活的重试政策

Workmanager提供灵活的重试策略,包括可配置的指数退回策略,以处理可能失败的案例。

工作链接

对于复杂的相关工作,您可以使用直观的接口将单个工作任务链接在一起,该界面使您可以顺序控制哪些件并并行运行。一个任务的输出数据可以自动传递到下一个任务。

内置螺纹互操作性

Workmanager与Coroutines和Rxjava无缝集成,提供了灵活的插入您自己的异步API以更好地控制螺纹的API。

3.安排立即工作

要安排在Workmanager中的即时工作,您可以使用OneTimeWorkRequest类以及Worker实现。如果需要更高的优先级执行,您也可以将任务设置为加急。

val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
    .setExpedited(true) // Set as expedited if required
    .build()

WorkManager.getInstance(context).enqueue(workRequest)

4.安排长期运行的工作

对于长期运行的任务,您可以使用任何WorkRequest子类以及相应的Worker实现。如果要显示正在进行的任务的通知,可以在Worker类中调用setForeground()

val longRunningWork = PeriodicWorkRequestBuilder<MyWorker>(repeatInterval, repeatIntervalTimeUnit)
    .setInputData(myData)
    .setForeground(true) // Show notification for ongoing task
    .build()

WorkManager.getInstance(context).enqueue(longRunningWork)

5.安排延期工作

安排从以后开始的可推迟工作,可以定期运行,您可以将PeriodicWorkRequestWorker实现一起使用。

val deferrableWork = PeriodicWorkRequestBuilder<MyWorker>(repeatInterval, repeatIntervalTimeUnit)
    .setInputData(myData)
    .build()

WorkManager.getInstance(context).enqueue(deferrableWork)

6.定义工作限制

工作限制使您可以指定工作的最佳条件。您可以定义限制,例如网络连接,设备充电状态,电池级别等。

val workConstraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val constrainedWork = OneTimeWorkRequestBuilder<MyWorker>()
    .setConstraints(workConstraints)
    .build()

WorkManager.getInstance(context).enqueue(constrainedWork)

7.处理链接的工作

工作链接使您可以将多个工作任务链接在一起,从而定义它们之间的依赖性。可以将一个任务的输出数据自动传递给下一个任务。

val cleanupWork = OneTimeWorkRequestBuilder<CleanupWorker>().build()
val waterColorFilterWork = OneTimeWorkRequestBuilder<WaterColorFilterWorker>().build()
val grayScaleFilterWork = OneTimeWorkRequestBuilder<GrayScaleFilterWorker>().build()
val blurEffectFilterWork = OneTimeWorkRequestBuilder<BlurEffectFilterWorker>().build()

val saveImageToGalleryWork = OneTimeWorkRequestBuilder<SaveImageToGalleryWorker>()
    .addTag(Constants.TAG_OUTPUT)
    .build()

val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>()
    .addTag(Constants.TAG_OUTPUT)
    .build()

val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, cleanupWork)
    .then(waterColorFilterWork)
    .then(grayScaleFilterWork)
    .then(blurEffectFilterWork)
    .then(if (save) saveImageToGalleryWork else uploadWork)

continuation.enqueue()

8.内置螺纹互操作性

使用Workmanager的优点之一是它与Coroutines和Rxjava的无缝集成。您可以轻松地将这些线程框架与Workmanager结合在一起,以处理任务中的异步操作。

例如,使用Workmanager使用Coroutines:

class MyCoroutineWorker(appContext: Context, workerParams: WorkerParameters) :
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        // Perform asynchronous operations using Coroutines
        return Result.success()
    }
}

9.使用工人进行可靠的工作

Workmanager设计用于可靠的工作,即使用户远离应用程序或设备重新启动,也需要运行。它适用于发送日志或分析以后端服务或定期将应用程序数据与服务器同步的任务。

但是,如果应用程序消失,可以安全终止的过程中的背景工作不打算安全。对于需要立即执行的所有工作的一般解决方案也不是一般解决方案。在这种情况下,应考虑其他解决方案,例如Coroutines或AlarmManager。

10.与其他API的关系

推荐某些不需要持久性的用例,建议使用coroutines,但不应用于持续工作。 Coroutines主要是一个并发框架,而工人是专门为持续背景处理而设计的。

AlarmManager仅应用于与时钟或日历有关的警报,而不是用于一般背景工作。与Workmanager不同,AlarmManager从Doze Mode醒来了设备,这在功率和资源管理方面效率较低。

11.从工人开始

要开始在Android应用中使用Workmanager,请按照以下步骤:

  1. 将必要的依赖项添加到您的项目的build.gradle文件中。
  2. 定义Worker子类并实现所需的doWork()方法。
  3. 使用构建器模式创建OneTimeWorkRequestPeriodicWorkRequest的实例。
  4. 使用WorkManager.getInstance(context).enqueue()的工作请求。

有关详细说明和代码示例,请参阅Workmanager入门的官方Android文档。

12.其他资源

这里有一些其他资源,您可以在其中找到有关工人的更多信息:

凭借其强大的功能和与其他线程框架的无缝集成,Workmanager无疑是Android应用程序背景处理的首选解决方案。通过明智地安排任务并定义约束,您可以确保您的应用程序在提供出色的用户体验的同时有效地执行。

记住适当处理不同类型的持续工作,根据最佳条件定义工作约束,利用工作链来进行复杂的任务,并利用与Coroutines和RXJAVA的内置螺纹互操作性。立即开始使用Workmanager,然后将您的Android背景处理提升到一个新的水平!