Android--Jetpack--WorkManager详解

news2024/11/19 7:28:12

2024已经到来,愿你安睡时,山河入梦。愿你醒来时,满目春风。愿你欢笑时,始终如一。愿你行进时,前程似锦,坦荡从容。

编程语言的未来?

目录

一,定义

二,特点

三,作用

四,角色

五,简单使用

1,添加依赖

2,创建自己的worler并继承worker

3,在activity中使用

4,点击按钮输出如下

 六,数据传递

1,创建worker

2,在activity中使用

3,点击按钮输出如下

 七,多个任务顺序执行

1,创建三个worker

2,在activity中使用

3,点击按钮输出如下

八,重复执行后台任务

九,添加约束条件


一,定义

WorkManager是Android Jetpack的一部分,开发中,我们的任务不可能总是在前台,但是还要确保那些重要任务的执行,我们就可以放置 在后台执行,那么WorkManager就能够发挥其作用了。 它适用于需要保证系统即使应用程序退出也会运行的任务,WorkManager API可以轻松指定可延迟的 异步任务以及何时运行它们,这些API允许您创建任务并将其交给WorkManager立 即运行或在适当的时间运行。 WorkManager根据设备API级别和应用程序状态等因素选择适当的方式来运行任 务。如果WorkManager在应用程序运行时执行您的任务之一,WorkManager可以 在您应用程序进程的新线程中运行您的任务。如果您的应用程序未运行, WorkManager会选择一种合适的方式来安排后台任务 - 具体取决于设备API级别和包 含的依赖项,WorkManager可能会使用 JobScheduler,Firebase JobDispatcher或 AlarmManager

二,特点

1,支持异步一次性和定期任务

2,支持网络条件,存储空间和充电状态等约束

3,链接复杂的工作请求,包括并行运行工作

4,一个工作请求的输出用作下一个工作的输入

5,将API级别的兼容性处理回API级别14(请参阅注释)

6,可以使用或不使用Google Play服务

7,遵循系统健康最佳实践

8,LiveData支持可轻松在UI中显示工作请求状态

三,作用

1,确保重要的后台任务,一定会被执行,后台任务(例如:非及时性的 (请求服 务器 及时性) 上传,下载,同步数据 等)

2,内部对电量进行了优化,不需要我们去处理电量优化了

3,API 14 到 最新版本,都可以使用WorkManager来管你你的后台任务

4,注意:WorkManager不能做保活操作

5,调度,管理,执行的后台任务的场景,通常是是可延迟的后台任务

四,角色

1,Worker:指定需要执行的任务,可以成为Workder类的子类,在实现的方法中,就可以执行任务逻辑了

2,WorkRequest:执行一项单一的任务

①:WorkRequest对象必须指定Work执行的任务

②:WorkRequest都有一个自动生成的唯一ID,可以使用ID执行取消 排队任务 或 获取任务状态等操作

③:WorkRequest是一个抽象的类;系统默认实现子类 OneTimeWorkRequest或PeriodicWorkRequest

④:WorkRequest.Builder创建WorkRequest对象;相应的子类: OneTimeWorkRequest.Builder或PeriodicWorkRequest.Builder

⑤:Constraints:指定对任务运行时间的限制(任务约束);使用 Constraints.Builder创建Constraints对象 ,并传递给WorkRequest.Builder

3,WorkManager:排队和管理工作请求;将WorkRequest 对象传递WorkManager的 任务队列

(注意:如果未指定任何约束, WorkManager立即运行任务)

4,WorkStatus:包含有关特定任务的信息;可以使用LiveData保存 WorkStatus对象, 监听任务状态;如LiveData

五,简单使用

1,添加依赖

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

2,创建自己的worler并继承worker

public class YZWorker1 extends Worker {


    public YZWorker1(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
    
    
    //后台执行的任务 并且是异步的
    @NonNull
    @Override
    public Result doWork() {
        System.out.println("YZWorker1:执行后台任务");
        //成功就返回success  失败返回failure
        return Result.success();
    }
}

3,在activity中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker1"
        />

</LinearLayout>
public class MainActivity extends AppCompatActivity {

    private TextView txt1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt1 = findViewById(R.id.txt_1);

        txt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                OneTimeWorkRequest oneTimeWorkRequest =
                        new OneTimeWorkRequest.Builder(YZWorker1.class).build();
                WorkManager.getInstance(MainActivity.this).enqueue(oneTimeWorkRequest);
            }
        });
    }
}

4,点击按钮输出如下

 

 六,数据传递

实现activity和worker的数据传递:

1,创建worker

public class YZWorker2 extends Worker {

    private Context mContext;
    private WorkerParameters workerParams;

    public YZWorker2(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        this.mContext = context;
        this.workerParams = workerParams;
    }

    @SuppressLint("RestrictedApi")
    @NonNull
    @Override
    public Result doWork() {
        // 接收 MainActivity传递过来的数据
        String data = workerParams.getInputData().getString("YuanZhen");
        System.out.println("YZWorker2:Activity传递过来的数据:"+data);

        // 把任务中的数据回传到activity中
        Data outputData = new Data.Builder().putString("YuanZhen", "我是worker2的数据").build();
        Result.Success success = new Result.Success(outputData);
        
        return success;
    }
}

2,在activity中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker1"
        />

    <TextView
        android:id="@+id/txt_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker2"
        />

</LinearLayout>
public class MainActivity extends AppCompatActivity {

   
    private TextView txt2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
        txt2 =findViewById(R.id.txt_2);

       
        txt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 数据
                Data sendData = new Data.Builder().putString("YuanZhen", "我是MainActivity的数据").build();

                // 请求对象初始化
                OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(YZWorker2.class)
                        .setInputData(sendData)
                        .build();

                // 想接收任务回馈的数据,需要状态机
                WorkManager.getInstance(MainActivity.this).getWorkInfoByIdLiveData(oneTimeWorkRequest.getId())
                        .observe(MainActivity.this, workInfo -> {
                            System.out.println("MainActivity:当前状态:"+workInfo.getState().name());
                            if (workInfo.getState().isFinished()) {
                                // 状态机 成功的时候 才去打印
                                System.out.println("MainActivity:取到了任务回传的数据:"+workInfo.getOutputData().getString("YuanZhen"));
                            }
                        });
                WorkManager.getInstance(MainActivity.this).enqueue(oneTimeWorkRequest);
            }
        });


    }
}

3,点击按钮输出如下

 

 七,多个任务顺序执行

1,创建三个worker

public class YZWorker3 extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        System.out.println("YZWorker3:执行了");
        return Result.success();
    }
}
public class YZWorker4 extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        System.out.println("YZWorker4:执行了");
        return Result.success();
    }
}
public class YZWorker5 extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {
        System.out.println("YZWorker5:执行了");
        return Result.success();
    }
}

2,在activity中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker1"
        />

    <TextView
        android:id="@+id/txt_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker2"
        />

    <TextView
        android:id="@+id/txt_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YZWorker3"
        />

</LinearLayout>
public class MainActivity extends AppCompatActivity {

 
    private TextView txt3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        txt3 =findViewById(R.id.txt_3);

       

        txt3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 单一的任务  一次
                OneTimeWorkRequest oneTimeWorkRequest3 = new OneTimeWorkRequest.Builder(YZWorker3.class).build();
                OneTimeWorkRequest oneTimeWorkRequest4 = new OneTimeWorkRequest.Builder(YZWorker4.class).build();
                OneTimeWorkRequest oneTimeWorkRequest5 = new OneTimeWorkRequest.Builder(YZWorker5.class).build();

                // 顺序执行 3 4 5
                WorkManager.getInstance(MainActivity.this)
                        .beginWith(oneTimeWorkRequest3)
                        .then(oneTimeWorkRequest4)
                        .then(oneTimeWorkRequest5)
                        .enqueue();
            }
        });


    }
}

3,点击按钮输出如下

八,重复执行后台任务

public class MainActivity extends AppCompatActivity {


    private TextView txt4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
        txt4 =findViewById(R.id.txt_4);

       

        txt4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 不能小于15分钟,否则默认修改成 15分钟
                PeriodicWorkRequest periodicWorkRequest
                        = new PeriodicWorkRequest.Builder(YZWorker5.class, 10, TimeUnit.SECONDS).build();

                // 一直都是 ENQUEUE,因为是轮询的任务,所以看不到 SUCCESS  如果是单个任务,就会看到SUCCESS
                WorkManager.getInstance(MainActivity.this).getWorkInfoByIdLiveData(periodicWorkRequest.getId())
                        .observe(MainActivity.this, new Observer<WorkInfo>() {
                            @Override
                            public void onChanged(WorkInfo workInfo) {
                                System.out.println("MainAcitvity状态:"+workInfo.getState().name());
                                if (workInfo.getState().isFinished()) {
                                    System.out.println("MainAcitvity状态:isFinished=true");
                                }
                            }
                        });

                WorkManager.getInstance(MainActivity.this).enqueue(periodicWorkRequest);
            }
        });


    }
}

九,添加约束条件

public class MainActivity extends AppCompatActivity {



    private TextView txt5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        txt5 =findViewById(R.id.txt_5);

       
        txt5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 约束条件,必须满足条件,才能执行后台任务
                Constraints constraints = new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED) // 网络连接
                        .setRequiresCharging(true) // 充电
                        .build();

     
                OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YZWorker3.class)
                        .setConstraints(constraints)
                        .build();

                // 加入队列
                WorkManager.getInstance(MainActivity.this).enqueue(request);
            }
        });

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【心得】PHP文件包含高级利用攻击面个人笔记

目录 一、nginx日志文件包含 二、临时文件包含 三、php的session文件包含 四、pear文件包含 五 、远程文件包含 文件包含 include "/var/www/html/flag.php"; 一 文件名可控 $file$_GET[file]; include $file.".php"; //用php伪协议 &#xff0…

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

uniapp 使用wx.getFuzzyLocation获取当前的模糊地理位置

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;需要用到定位的功能&#xff0c;然后首先是尝试了getLocation方法&#xff0c;但是sccess中的内容始终无法打印&#xff0c;后来才知道是需要申请权限&#xff0c;在连续小程序后台管理员申请权限之后&#x…

【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

《开心消消乐》已经完成鸿蒙原生应用开发&#xff0c;乐元素成为率先完成鸿蒙原生应用开发的 20游戏厂商之一。作为一款经典游戏&#xff0c;《开心消消乐》已经拥有 8 亿玩家&#xff0c;加入鸿蒙原生应用生态&#xff0c;将为其带来更优的游戏性能和更多创新体验。自 9 月 25…

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

虹科方案|从困境到突破:TigoLeap方案引领数据采集与优化

导读&#xff1a;在数字化工厂和智能制造的时代&#xff0c;数据已经成为优化机器和流程的关键。然而&#xff0c;如何高效地收集和处理这些数据&#xff0c;特别是在开发、部署和生产阶段&#xff0c;仍是企业面临的一大挑战。虹科TigoLeap平台&#xff0c;作为一款引领行业变…

Windows mp4info使用教程(提取MP4盒子信息、MP4 box信息、box分析工具、atom分析工具)

参考文章&#xff1a;https://www.onlinedown.net/soft/617940.htm 文章目录 软件主界面打开视频文件点击左方能看到各盒子信息 软件主界面 双击打开软件&#xff1a; 打开视频文件 点击左方能看到各盒子信息 比我用xxd命令查看原始16进制数据方便多了。 ᅟᅠ        …

C++初阶——类与对象

目录 C宏函数 在使用宏函数时&#xff0c;有几个常见的错误需要注意&#xff1a; 宏函数在某些情况下有以下优势&#xff1a; 1.C宏函数 在 C 中&#xff0c;宏函数&#xff08;Macro Function&#xff09;是使用预处理器定义的宏&#xff08;Macro&#xff09;&#xff0…

一、HTML5简介

一、简介 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 <!…

swift-碰到的问题

如何让工程不使用storyboard和scene 删除info.plist里面的Application Scene mainifest 删除SceneDelegate.swift 删除AppDelegate.swift里面的这两个方法 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession…

javascript 常见工具函数(四)

31.RGB值和十六进制值之间的转换&#xff1a; &#xff08;1&#xff09;十六进制的颜色转为 RGB格式&#xff1a; /*16进制颜色转为RGB格式*/String.prototype.colorRgb function () {var sColor this.toLowerCase();if (sColor && reg.test(sColor)) {if (sColor.l…

【通讯录案例-登录功能-Segue Objective-C语言】

一、我们接下来呢,来说这个登录按钮的实现, 1.我们来实现一下这个登录按钮的一个功能啊, 比如说,当我点击“登录”了以后,我要跳到后边儿的那个TableView, 首先呢,我们来看一下示例程序,参考一下, 当我们上边这两个文本框都有值的时候, 当这两个文本框都有值了以后…

Nginx - 使用error_page实现带有图片的自定义错误页面

文章目录 概述官网文档需求实现 概述 在Nginx中&#xff0c;您可以使用error_page指令来指定当请求遇到特定错误时应当显示的自定义错误页面。为了实现带有图片的自定义错误页面&#xff0c;可以按照以下步骤操作&#xff1a; 创建错误页面&#xff1a; 首先&#xff0c;需要…

three.js 多通道组合

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"border: 1px so…

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

新全国产迅为龙芯 3A6000 处理器板卡

11月28日&#xff0c;“2023龙芯产品发布暨用户大会”在北京举行&#xff0c;迅为作为龙芯重要合作伙伴受邀参加&#xff0c;在整机产品发布仪式上&#xff0c;展示了基于龙芯 3A6000 处理器的全国产安全型工控计算机。 龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

Vue实现JSON字符串格式化编辑器组件

相信很多同学都用过网上的在线JSON格式化工具来将杂乱的JSON数据转换成易于我们阅读和编辑的格式。那么&#xff0c;你有没有想过自己动手实现一个这样的工具呢&#xff1f;今天&#xff0c;我将介绍如何使用Vue.js来构建一个简单的JSON格式化工具。 功能简述 支持格式化JSON字…