Android--Jetpack--WorkManager详解

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@Overridepublic Result doWork() {System.out.println("YZWorker1:执行后台任务");//成功就返回success  失败返回failurereturn 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"><TextViewandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt1 = findViewById(R.id.txt_1);txt1.setOnClickListener(new View.OnClickListener() {@Overridepublic 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@Overridepublic 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"><TextViewandroid:id="@+id/txt_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="YZWorker1"/><TextViewandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt2 =findViewById(R.id.txt_2);txt2.setOnClickListener(new View.OnClickListener() {@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic 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"><TextViewandroid:id="@+id/txt_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="YZWorker1"/><TextViewandroid:id="@+id/txt_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="YZWorker2"/><TextViewandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt3 =findViewById(R.id.txt_3);txt3.setOnClickListener(new View.OnClickListener() {@Overridepublic 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 5WorkManager.getInstance(MainActivity.this).beginWith(oneTimeWorkRequest3).then(oneTimeWorkRequest4).then(oneTimeWorkRequest5).enqueue();}});}
}

3,点击按钮输出如下

八,重复执行后台任务

public class MainActivity extends AppCompatActivity {private TextView txt4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt4 =findViewById(R.id.txt_4);txt4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 不能小于15分钟,否则默认修改成 15分钟PeriodicWorkRequest periodicWorkRequest= new PeriodicWorkRequest.Builder(YZWorker5.class, 10, TimeUnit.SECONDS).build();// 一直都是 ENQUEUE,因为是轮询的任务,所以看不到 SUCCESS  如果是单个任务,就会看到SUCCESSWorkManager.getInstance(MainActivity.this).getWorkInfoByIdLiveData(periodicWorkRequest.getId()).observe(MainActivity.this, new Observer<WorkInfo>() {@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txt5 =findViewById(R.id.txt_5);txt5.setOnClickListener(new View.OnClickListener() {@Overridepublic 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.mzph.cn/news/592533.shtml

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

相关文章

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。这个问题如何解决?

这个错误信息 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 表示 vue-cli-service 命令在你的系统上未被识别。这通常是因为 Vue CLI 没有被正确安装或其路径没有被加入到系统的环境变量中。以下是几个解决这个问题的步骤&#xff1a; 确认 …

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

面试算法84:包含重复元素集合的全排列

题目 给定一个包含重复数字的集合&#xff0c;请找出它的所有全排列。例如&#xff0c;集合[1&#xff0c;1&#xff0c;2]有3个全排列&#xff0c;分别是[1&#xff0c;1&#xff0c;2]、[1&#xff0c;2&#xff0c;1]和[2&#xff0c;1&#xff0c;1]。 分析 下面采用回溯…

从0搭建github.io网页

点击跳转到&#x1f517;我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行&#xff0c;始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

如何为开源项目和社区做贡献 -- 你应该知道的十件事(四)——如何创建自己的开源项目?

问题四&#xff1a;如何创建自己的开源项目&#xff1f; 在前文中&#xff0c;我们已经介绍了最常见的给开源项目做贡献的两种途径&#xff0c;但随着你做开源项目的深入&#xff0c;你可能就会发现一个新的方向并推出自己的开源项目&#xff0c;下面&#xff0c;我将结合我的讲…

Linux 命令echo

命令作用 输出一行字符串在shell中&#xff0c;可以打印变量的值输出结果写入到文件在显示器上显示一段文字&#xff0c;起到提示的作用 语法 echo [选项] [字符串] 参数 字符含义-n不自动换行-e解释转义字符-E不解释转义字符 如果-e有效&#xff0c;则识别以下序列&…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …

力导向图与矩阵排序

Graph-layout force directed&#xff08;力导向图布局&#xff09;是一种用于可视化网络图的布局算法。它基于物理模型&#xff0c;模拟了图中节点之间的相互排斥和连接弹性&#xff0c;以生成具有良好可读性和美观性的图形布局。 在力导向图布局中&#xff0c;每个节点被视为…

(一)Matlab数值计算基础

目录 1.1Matlab命令组成 1.1.1基本符号 1.1.2功能符号 1.1.3常用命令 1.1Matlab命令组成 1.1.1基本符号 #提示运算符&#xff0c;表示软件处于准备就绪状态。在提示符号后输入一条命令或者一段程序后按Enter键&#xff0c;软件将给出相应的结果 >> *…

基于SpringBoot的影院订票系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的影院订票系统,java项目…

牛客练习赛50-C

题目描述 在一个游戏中&#xff0c;tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i]&#xff0c;团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求&#xff1a;如果选了第i个士兵&#xff0c;这个士兵希望团的人数不超过s[i]…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…

使用 Spectrum LSF 设置多集群和作业转发

使用 Spectrum LSF 设置多集群和作业转发 以下示例是有关如何使用 Spectrum LSF设置多集群和作业转发的指南。 此示例说明了集群是本地集群&#xff0c;另一个在云中的常见情况。 此示例假定标注为 “OnPremiseCluster” 的内部部署集群使用子网 192.168.0.0/24 &#xff0c;…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

奇因子之和(C语言)

题意&#xff1a; 一个整数的因子&#xff0c;就是所有可以整除这个数的数。奇数指在整数中&#xff0c;不能被 2 整除的数。所谓整数 Z 的奇因子&#xff0c;就是可以整除 Z 的奇数。 给定 N 个正整数&#xff0c;请你求出它们的第二大奇因子的和。当然&#xff0c;如果该数只…

Amazon API Gateway CORS 实战

Amazon API Gateway提供了一种实现跨域资源共享&#xff08;CORS&#xff09;的方式&#xff0c;以便在Web应用程序中安全地使用API。下面是Amazon API Gateway CORS的实战指南&#xff1a; 创建一个API Gateway REST API并定义资源和方法。在资源上启用CORS&#xff0c;可以通…

程序的重定位

可以理解为编译和链接 过程中产生的地址项都是临时的相对的。编译的时候的地址&#xff0c;在链接时会被修改。最终链接后生成的bin文件的地址项&#xff0c;在加载运行时 也会被修改。 链接器会对所有的输入文件进行扫描&#xff0c;之后就可以确定段的大小&#xff0c;符号定…

从0开始搭建清华ChatGLM3 6b大模型(Windows RTX4090版)

目录 1、硬件及软件说明 2、安装Anaconda 3、安装Git版本控制 ​4、安装pytorch驱动 5、安装ChatGLM3 1、硬件及软件说明 硬件&#xff1a;主要是GPU卡内存要足够&#xff0c;本次搭建使用的RTX4090卡一张&#xff0c;单卡内存24G&#xff0c;为什么选择4090&#xff1f;…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…