【Android】WorkManager的使用

这篇具有很好参考价值的文章主要介绍了【Android】WorkManager的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序言

本文主要讲WorkManager的一些使用

WorkManager是在 Android 应用中调度和执行后台任务。它提供了一种灵活、可靠的方式来管理后台任务,并确保它们在最佳的设备条件下执行。

以下是 WorkManager 的主要作用:

后台任务调度:WorkManager 允许您调度延迟执行或周期性执行的后台任务。您可以指定任务的触发条件,例如设备空闲时、电量充足时或网络连接可用时。这使得您可以在适当的时机执行任务,以避免对设备性能和用户体验造成影响。

灵活的执行策略:WorkManager 提供了多种执行策略,以适应不同的需求。它可以在设备闲置时执行任务,也可以在指定的时间间隔内重复执行任务。此外,WorkManager 还具有智能的退避和重试功能,可以自动处理任务执行失败的情况。

设备适配性:WorkManager 能够与不同版本的 Android 平台和设备进行适配。它会自动选择合适的后台执行解决方案,如 JobScheduler(Android 5.0 及以上)或 AlarmManager(Android 4.4 及以下),以确保任务能够在各种设备上正常运行。

生命周期感知性:WorkManager 可以与应用程序的生命周期进行集成,因此即使应用程序在后台运行或在设备重启后重新启动,它也可以继续执行任务。这使得您的任务能够持久地在设备上运行,并保持与应用程序的一致性。

跨应用程序支持:WorkManager 可以在多个应用程序之间共享和传递数据,使不同应用程序之间的后台任务协同工作成为可能。这对于需要在不同应用程序之间进行数据同步或协作的情况非常有用。

使用方式

引入依赖

implementation "androidx.work:work-runtime:2.7.1"
//此依赖可以在WorkManager里面使用协程
implementation 'androidx.work:work-runtime-ktx:2.7.1'

创建 Worker 类

需要创建一个继承自 Worker 的工作类,用于定义要在后台执行的任务。例如,创建一个名为 MyWorker.java 的文件,并实现 doWork() 方法:

public class MyWorker extends Worker {

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        // 在这里执行后台任务逻辑
        // ...

        // 返回 Result.success()、Result.failure() 或 Result.retry()
        return Result.success();
    }
}

这个是一般的使用方式,但是如果想要在WorkManager里面使用协程的话,需要这样创建,我们这里创建一个UploadWorker类

class UploadWorker(context: Context, workerParameters: WorkerParameters) :
    CoroutineWorker(context, workerParameters) {

   override suspend fun doWork(): Result {
   
   return withContext(Dispatchers.IO) {
         
         Result.success()
       }
 } 

我们创建一个WorkManager
我是在Service里面创建的

//懒加载
    private val workManager: WorkManager by lazy {
        WorkManager.getInstance(this)
    }
        //清删除已完成的、取消的或失败的后台任务。它是一个方法来清理 WorkManager 的任务队列,以便只保留有效的任务信息。
        //workManager.pruneWork()
        
        //在什么状态下执行
        val constraints = Constraints.Builder()
            .setRequiresCharging(true) // 需要充电状态
            .setRequiredNetworkType(NetworkType.CONNECTED) // 需要网络连接
            .build()
            
        var workInfoList: MutableList<WorkInfo>? = null
        try {
        //获取带有某个TAG的WorkManager
            workInfoList =
                workManager.getWorkInfosByTag(ConfigData.STR_WORK_MANAGER_NAME).get()
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
        if (workInfoList.isNullOrEmpty()) {
            Log.e(TAG, "此时WorkManager里面没有任务")
            //设置15分钟执行一次的循环任务(循环任务最低就是15分钟)
            val request =
                PeriodicWorkRequest.Builder(UploadWorker::class.java, 15, TimeUnit.MINUTES)
                    .setInitialDelay(1, TimeUnit.MINUTES)//首次执行延迟1分钟执行
                    .addTag(ConfigData.STR_WORK_MANAGER_NAME)//添加TAG
                    .setConstraints(constraints)
                    .build()
            Log.e(TAG, "开始执行定时循环任务")
            workManager.enqueue(request)
        } else {
            //Log.e(TAG, "此时运行的WorkManager服务:$workInfoList")
            for (info in workInfoList) {
                Log.e(TAG, "此时运行的WorkManager服务ID:${info.id}")
                Log.e(TAG, "此时运行的WorkManager服务TAG:${info.tags}")
                Log.e(TAG, "此时运行的WorkManager服务STATE:${info.state}")
                Log.e(TAG, "此时运行的WorkManager服务OUTPUTDATA:${info.outputData}")
                Log.e(TAG, "此时运行的WorkManager服务PROGRESS:${info.progress}")
                Log.e(TAG, "此时运行的WorkManager服务ATTEMPT:${info.runAttemptCount}")
            }

        }

如果不想要WorkManager,可以使用以下方式进行取消

取消单个任务:
可以使用 WorkManager 的 cancelWorkById(UUID) 方法取消具有指定唯一标识符的单个任务。传入任务的唯一标识符即可取消该任务。

val workId: UUID = // 获取要取消任务的唯一标识符
WorkManager.getInstance(context).cancelWorkById(workId)

取消带有特定标签的任务:
如果给任务设置了标签,可以使用 WorkManager 的 cancelAllWorkByTag(String) 方法取消所有具有特定标签的任务。传入任务的标签名称即可取消带有该标签的所有任务。

val tag: String = // 获取要取消任务的标签名称
WorkManager.getInstance(context).cancelAllWorkByTag(tag)

注意:取消任务时,只会取消还未开始执行的任务。如果任务已经在运行或已经完成,取消操作将不会产生任何影响。

取消所有任务:
如果想取消所有当前排队的任务,可以使用 WorkManager 的 cancelAllWork() 方法。

WorkManager.getInstance(context).cancelAllWork()
注意

我们在创建这个WorkManager之后,WorkManager会自动在后台进行运行,即使我们的APP程序已经停止运行了,我们创建的WorkManager还是会继续运行,此问题需要我们注意。

比如我们在我们的APP程序启动运行后自动创建一个WorkManager执行任务,此时我们给这个WorkManager添加了一个TAG,但是我们在APP结束运行之后,我们的WorkManager还在运行,然后我们再启动APP,此时又创建了一个新的WorkManager,然后根据程序代码,我们给这个WorkManager又赋值一个相同的TAG,是的,不同的WorkManager是可以有相同的TAG的,因为他们的id是不一样的,所以他们不是同一个WorkManager文章来源地址https://www.toymoban.com/news/detail-530874.html

到了这里,关于【Android】WorkManager的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Jetpack 从使用到源码深耕【调度任务组件WorkManager 从实践到原理 】(二)

    上文,我们进行了google 任务调度系列知识体系的回顾、探索,引出了WorkManager 。然后我们基于一个简单的需求背景,进行了WorkManager的引入使用,不过从使用上,我们看到和JobScheduler几乎一样的使用步骤,所以猜想内部实现原理,估计和JobScheduler差不多,本文,我们就WorkMa

    2023年04月09日
    浏览(29)
  • Android Jetpack组件库(第三部分)---WorkManager

    Android Jetpack 是 Google 推出的一整套帮助 Android 应用程序开发的库、工具包和架构指南,旨在为 Android 应用程序提供更快,更轻松,更稳定的开发体验。自推出以来已经发展成了一个庞大的技术生态系统,包括了许多使用方便、功能强大的库,以下是其中一些新特性、新组件:

    2024年02月07日
    浏览(34)
  • Android Studio 学习笔记--LogCat的使用

    LogCat是Android中的命令行工具, 用于获取程序从启动到关闭的日志信息 。Android中的应用运行在一个单独的设备中,应用的调试信息会输出到这个设备单独的日志缓冲区中,要想从设备日志缓存区中取出信息,就需要学会使用LogCat Log类所输出的日志内容分为 6 个级别,由低到

    2024年02月10日
    浏览(45)
  • 学习笔记—Android studio导入OpenCV配置使用

    官网下载sdk,打开opencv官网,点击Android,完成后解压 https://opencv.org/ 解压后,文件夹下有这些文件 samples Android代码工程 sdk 包含opencv的Java的接口和JNI接口等 打开Android studio,选择模板,这时选择最后一项Native C++,然后进入配置界面。 这里注意你下载的Android-sdk版本来选择

    2024年02月07日
    浏览(32)
  • 【学习笔记】在Android使用Frida进行https抓包

    最近需要在Android进行https抓包,对数据解密,找了很多方法,终于成功了,不过原文一些步骤对于我这个小白还是有点不理解的地方,在此记录一下。 一台root手机 frida环境 该步骤全程参考: [Frida入门教程] 一文搞定Frida环境搭建,基于逍遥模拟器(虚拟设备)和ADB(Android Debug

    2024年02月16日
    浏览(29)
  • Android Studio的笔记--SerialPort串口通讯学习和使用

    摘要:本篇介绍android中SerialPort串口通讯学习和使用。主要用到android-serialport-api。 几个工程参考学习使用 Google开源的Android串口通信Demo android-serialport-api 源码下载 cepr/android-serialport-api SerialPort获取串口输入输出流 SerialPortFinder获取硬件地址 可以推荐看android串口通信——andr

    2024年02月06日
    浏览(38)
  • 【Android学习笔记】Android布局属性大全

    第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘

    2024年01月16日
    浏览(28)
  • 【Android】学习笔记

    目录 准备 界面:view控件 LayoutCreator 事件监听OnClickListener 转跳页面Intent Intent传递数据 Toast和AlertDialog Gson使用 OKhttp3的基本使用 post方法 get方法 轻量级存储SharedPreference ListView基本使用 1、SimpleAdapter 2、较复杂的数据绑定 3、ListView的事件监听 开发软件配置:Android Studio, API34 打

    2024年02月05日
    浏览(32)
  • Android学习笔记

    Android是一种廉价而又灵活的智能手机操作系统,它的普及使得人们可以拥有一款更加便捷的智能手机。Android系统的普及,提升了智能手机的使用价值,让人们的生活更加便捷。那么,如何学习Android呢?下面是一篇关于学习Android的文章,希望对初学者有所帮助。 一、了解A

    2024年02月02日
    浏览(25)
  • 《Android学习笔记》Android12蓝牙扫描不到设备的权限问题

    Android12 关于蓝牙这部分新增了 BLUETOOTH_SCAN 、 BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限,这些权限都属于敏感权限,都需要在代码中动态申请。移除了Android11 及以下版本中必须申请的位置权限[ FINE_LOCATION ] 和 [ COARES_LOCATION ]。 1、在Manifest.xml清单文件中添加对应的权限。 其中 An

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包