注意[翻译]:WorkManager适用于那些即使应用程序退出,系统也能够保证这个任务正常运行的场景,比如将应用程序数据上传到服务器。...WorkManager在底层会根据你的设备情况进行有选择的调度。...4 WorkManager使用方法 Work manager APIs建立在几个类上,你必须继承一些抽象类来安排任务。...().cancelByWorkId(compressionWorkId); WorkManager 会尽最大努力取消任务,但实质上这是不确定的 - 当我们尝试取消任务时,任务可能已经运行或完成。...WorkManager还提供方法来取消 唯一工作序列(在高级用法中会有所涉及)中的所有任务,或尽最大努力的取消具有指定标记的所有任务。
它的主要特点包括:独立执行:WorkManager的任务可以在应用退出后继续执行,适用于需要延迟执行或应用退出后仍需运行的任务。...自动管理:WorkManager会自动管理任务的执行和重试,减少了开发者的工作量。...兼容性:WorkManager会根据设备的API情况自动选择合适的实现方式,2.核心概念:在深入了解WorkManager之前,让我们先了解一些核心概念:WorkRequest(工作请求):表示要执行的单个后台任务...Worker(工作者):执行实际后台任务的类。您可以扩展Worker类并重写doWork()方法来定义自己的后台逻辑。WorkManager(工作管理器):用于调度和跟踪工作请求的中心类。...它负责将工作请求提交给适当的后台任务执行器,并处理与工作周期、重试策略等相关的逻辑。Constraints(约束条件):用于指定工作请求在何时运行的条件,如网络状态、电池状态等。
我们在开头就说了,workManager是一个可以用来进行后台任务的组件。...我们都知道通常在android中进行后台任务我们都用service,既然已经有了service,那为什么还要出一个workManager呢?...因为workManager比service强大太多,它可以在应用程序退出或者其他原因中止后,依然执行(本地任务如:本地图片的读取展示)或者应用程序打开后继续执行任务(网络请求)。...调用流程 看懂上面图片的意思了吧,翻译一下就是workManager发起一个任务,如果当前程序正在运行,它就会再开一个工作线程去处理,如果当前程序退出或者在后台,它就会选择一个合适的方案去执行,这就包括了...return jsonString } } 网络请求用的是kotlin中的协程,api接口是网络上随便找的。
注: WorkManager并不是一种新的工作线程,工作线程通常立即执行,而WorkManager不能保证任务被及时执行。...这也是Android的碎片化所导致的,许多厂商修改了手机ROM,造成不能得到执行,因此,分析需求是否可以使用WorkManager。...OneTimeWorkRequest 适用于调度非重复性工作,而 PeriodicWorkRequest 则更适合调度以一定间隔重复执行的工作。...OneTimeWorkRequest 对于无需额外配置的简单工作,请使用静态方法 from。...工作器的确切执行时间取决于您在 WorkRequest 对象中设置的约束以及系统执行的优化。 需要注意的是定义的最短重复间隔是 15 分钟,在源码中也可以看到。
介绍 在Android应用开发中,有效地管理后台任务是至关重要的。Android WorkManager是一个强大的库,旨在简化任务调度和后台工作管理。...工作原理 架构概述 WorkManager的内部实现采用了现代化的任务调度架构,分为以下几个核心组件: WorkManager: 提供任务调度和管理的主要接口,负责协调任务的执行。...AlarmManager: 在API级别更低的设备上,WorkManager会通过AlarmManager来实现任务的调度和唤醒。...使用OneTimeWorkRequest或PeriodicWorkRequest来创建工作请求,并设置触发条件。...在创建OneTimeWorkRequest时,可以使用setInputData方法设置输入数据,确保任务执行时有足够的信息。
而它的主要作用则是管理在后台工作的任务,即使APP没有启动,它也能保证任务可以被执行。...在5.0以上的版本WorkManager会通过JobScheduler或者Firebase的JobDispatcher来实现,而在5.0以下的版本,则会通过AlarmManager来实现 它有以下好处:...使用WorkManager 导入WorkManager 在app的Module中导入Kotlin的WorkManager。而目前的版本号已经到了1.0.0-alpha13。...在以下代码中,创建了只执行一次的任务OneTimeWorkRequest,并且携带了输入的参数setInputData,创建完后,就可以将它插入到WorkManager的队列中等待执行。...在1.0.0-alpha10版本中,还可以通过WorkManager.getInstance().getStatusesByTagLiveData()获取对应的Worker的Status。
工作线程通常能够立即执行,并在任务完成后将结果反馈给用户,而WorkManager不是即时的,它不能保证任务能够被立即执行。...后台延时任务 WorkManager能够保证任务一定会被执行,但不是不能保证被立即执行,也即说在适当的时候被执行。因为WorkManager有自己的数据库,与任务相关的信息和数据就保存到数据库中。...StorageNotLow:如果设置为 true,那么当用户设备上的存储空间不足时,工作不会运行。...对于工作请求,我们可以通过 WorkRequest.getTags() 检索其标记集。 3.1.8 分配输入数据 有时候,任务需要输入数据才能正常运行。...输入值以键值对的形式存储在 Data 对象中,并且可以在工作请求中设置,WorkManager 会在执行工作时将输入 Data 传递给工作,Worker 类可通过调用 Worker.getInputData
public Result doWork() { Log.i(TAG,"doWork"); return Result.success(); } } 在适当的地方...(workRequest.getId()); 6.参数传递 参数传递分成两方面,一个是创建任务时传入参数,一个是执行任务时传递参数 使用Data在创建任务时传入参数: //传入参数...addTag("work1") //传入参数 .setInputData(data) .build(); 在我们自定义的..."doWork", "doWork complete") .build(); return Result.success(data); } 可以在监听任务状态时...WorkInfo", doWork); } } }); 7.周期性任务 使用PeriodicWorkRequest对象,并且指定的时间不能低于
环境约束 WorkManager 允许我们指定任务执行的环境,比如网络已连接、电量充足时等,在满足条件的情况下任务才会执行。...这也是为什么前面说 WorkManager.getInstance().enqueue(request) 是将任务加入任务队列,并不代表马上执行任务,因为任务可能需要等到满足环境条件的情况才会执行。...以上,就是本文对 WorkManager 的简单介绍和用法讲解。 保活? 这里引入一个思考,既然 WorkManager 的生命力这么强,还可以实现定时任务,那能不能让我们的应用生命力也这么强?...换句话说,能不能用它来保活?...基本上,WorkManager 能做的,Service 也能做,我并没有想到有什么情况是非用 WorkManger 不可的。
3.使用WorkRequest配置任务 配置任务就是在告诉系统,任务在何时运行及如何运行,下面结合代码讲解 public class MainActivity extends AppCompatActivity...(this).enqueue(oneTimeWorkRequest);//将任务提交系统 } } 4.将任务提交系统:WorkManager.getInstance(this).enqueue...(oneTimeWorkRequest); 5.观察任务的状态,任务提交系统后,可以通过WorkInfo获知任务的状态,有三种方式获取WorkInfo对象: (1)WorkManager.getWorkInfosByTag...,这三个方法还有对应的LiveData方法,在方法后面加上LiveData即可。 ...周期性任务使用方式和一次性任务类似,不过需要注意的是,周期性任务的时间间隔不能少于15分钟。
当然这些后台工具的用法各不相同,徒增开发者的学习时间而已,于是乎谷歌索性把它们统一起来,在Jetpack库中推出了工作管理器WorkManager。...特别要注意,由于doWork方法运行于分线程,因此该方法内部不能操作界面控件。...3步的工作请求对象加入到管理器的执行队列,由管理器调度并执行请求任务,执行工作的代码例子如下所示: // 4、执行工作请求 WorkManager workManager = WorkManager.getInstance...眼尖的读者可能发现,第3步的工作请求类名叫做OneTimeWorkRequest,读起来像是一次性工作。...最后在活动页面中集成工作管理器,运行测试App后点击启动按钮,观察到任务执行结果如下图所示,可见成功获知了后台工作的运行情况。
约束类是可以在使用 WorkRequest.Builder 创建的时候进行传递给 WorkRequest。 WorkManager:工作任务管理器,它是用于管理工作任务的请求队列的类。...0x02 实践篇——工作流 假设我们在开发一个图片相关的APP,这个应用需要期地压缩它存储的图片。我们使用 WorkManager来实现这个需求。...val compressionWork = OneTimeWorkRequest.Builder().build() WorkManager.getInstance()....这时候, WorkManager在执行任务的时候就会考虑约束条件的情况。 取消任务 取消任务需要一个任务ID,可以通过 WorkRequest来获取。...跟一次性任务一样,通过 WorkManager.enqueue() 方法加入到工作任务队列中。
来调度任务: OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build(); WorkManager.getInstance...(getApplicationContext()).enqueue(workRequest); 1.2 原理和优势 WorkManager的工作原理是基于任务调度和约束条件。...这样,WorkManager 可以在不同 API 级别的设备上提供一致的任务调度策略。...对象,并设置我们的 Worker 和约束条件 OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder...问题:如何在不同API级别的设备上实现高效且节能的后台任务调度?
所以一段代码,在保证没有内存泄漏的情况下,能不能在异步框架下执行完毕,就得取决于代码所在载体(Activity/Fragment)的生命周期了。...WorkManager.getInstance() .enqueue(OneTimeWorkRequest.Builder(MakeSubscriptionWorker::class.java...所以,所谓的延迟,并不是那么的吓人,笔者亲测,在App还在前台的时候执行WorkManager,异步任务基本上还是马上会进入调度执行的,但是当app进入后台之后,WorkManager就会尝试暂停任务。...我突然发现,推广RxJava的时间成本,还有团队学习的成本,已经不能和以前在创业公司同日而语了。...WorkManager.getInstance() .beginWith(OneTimeWorkRequest.Builder(MakeSubscriptionWorker::class.java
(Chained tasks) WorkManager在执行多个工作任务的时候,可以指定执行顺序。...假设一个应用程序中有3个 OneTimeWorkRequest对象: workA、 workB、 workC。...这几个任务需要按照顺序执行,那么可以使用 WorkManager.beginWith()方法加入 workA,这时候会返回一个 WorkContinuation对象,它定义了工作任务的执行序列。...当这并行任务组都执行完之后才会执行接下来 then中的工作任务。...0x02 唯一任务序列(Unique work sequences) 在应用程序开发中,可能会多次把同一个链式任务添加到 WorkManager中,但希望只有一个链式任务在执行,这时候可以使用唯一任务序列对链式任务指定处理规则
所以,在不久的将来,service的使用范围会越来越小,取而代之的,是谷歌推出的新的技术:WorkManager。 WorkManager在工作的触发器 满足时, 运行可推迟的后台工作。...WorkManager会根据设备API的情况,自动选用JobScheduler, 或是AlarmManager来实现后台任务,WorkManager里面的任务在应用退出之后还可以继续执行(注意:是程序退出...// 对于一次性 WorkRequest,请使用 OneTimeWorkRequest, //对于周期性工作,请使用 PeriodicWorkRequest // 构建一次性请求...,那么其运行周期不能短与15分钟。...每个唯一的工作序列都有一个名字,WorkManager一次只允许一个工作序列使用该名称,当我们创建一个新的唯一工作序列时,如果已经有一个未完成的序列具有相同的名称,则指定WorkManager应执行的操作
最近因为工作需要正好研究了下,也作为补充章节分享给读者。 什么是WorkManager 按照官方描述,WorkManager 是适合用于持久性工作的推荐解决方案。...任务类型 WorkManager任务类型分为立即运行、长期运行和延期执行,使用方式与周期关系如下所示: 立即 一次性 OneTimeWorkRequest 和 Worker。...,不能傻傻的等着......StorageNotLow 如果设置为 true,那么当用户设备上的存储空间不足时,工作不会运行。...所以在第4小节中,默认Android12上并不会显示通知栏 WorkManager 只是一个处理定时任务的工具 WorkManager 最早兼容到 API 14(Android 4.0)
: 定义周期性任务 取消任务 自定义 WorkManager 配置 重复执行的任务 之前的文章中,我们已经介绍过使用 OneTimeWorkRequest 来规划任务。...间隔和弹性间隔 (FlexInterval) 如前文所述,WorkManager 不能保证任务在精确的某个时间去执行,但如果这是您的需求,那您可能需要寻找其他的 API。...由于重复间隔实际上是最小间隔,所以 WorkManager 还提供了一个附加参数,您可以使用该参数来指定一个窗口,从而让 Android 可以在窗口中执行您的任务。...目前,如果您需要在每天的大致同一时间执行某一个 Worker,那么最好的选择是使用 OneTimeWorkRequest 并设置初始延迟,这样您便可以在正确的时间执行任务: val currentDate...我已经看到这种模式几次,在 Application#onCreate 方法中,开发者创建了 WorkRequest 并将其入队。看起来一切正常,直到您发现有些任务重复执行了很多次。
WorkManager能帮我们更好的管理后台任务,可以更好地管理执行时机、执行顺序和执行状态(有无网络、是否在充电)。....setRequiresBatteryNotLow(true) //非低电量 .build(); //创建一次性请求 OneTimeWorkRequest...workRequest = new OneTimeWorkRequest.Builder(MyWorker.class) .setConstraints(constraints...(this).beginWith(workRequest2).then(workRequest).enqueue(); //可以监听任务的工作状态 LiveData<List...参考 知乎-WorkManager的基本使用 B站-Android Jetpack WorkManager | Android 中文教学视频 掘金-[译] 从Service到WorkManager
Rouse 读完需要 15 分钟 速读仅需8分钟 1 前言 上一次我们对Paging的应用进行了一次全面的分析,这一次我们来聊聊WorkManager。...这就产生了操作上的bug,降低了用户的体验,增加了用户不必要的操作。 那么该如何解决呢?很简单,看WorkManager的定义,使用WorkManager就可以轻松解决。...4 配置WorkRequest WorkManager主要是通过WorkRequest来配置任务的,而它的WorkRequest种类包括: OneTimeWorkRequest PeriodicWorkRequest...4.1 OneTimeWorkRequest 首先OneTimeWorkRequest是作用于一次性任务,即任务只执行一次,一旦执行完就自动结束。...5 添加到WorkContinuation中 上面我们已经将WorkRequest配置好了,剩下要做的是将其加入到work工作链中进行执行。
领取专属 10元无门槛券
手把手带您无忧上云