WorkManager根据设备API的级别和应用程序状态等因素来选择适当的方式运行任务。如果WorkManager在应用程序运行时执行你的任务,它会在应用程序进程的新线程中执行。...如果因为某种原因工作没抢占,相同的Worker实例不会被重用。即每个Worker实例只会调用一次doWork()方法,如果需要重新运行工作单元,需要创建新的Worker。...但是,你还可以给WorkRequest添加详细信息,比如任务运行时的环境。每个WorkRequest有一个自动生成的唯一ID,你可以使用ID来取消排队的任务或获取任务的状态。...(); mFuture.set(result); } }); return mFuture; } 可见,在调用doWork()后,任务执行完调用了set方法,此时会回调addListener方法。...addListener回调中主要用来判断当前任务的状态,所以如果任务被停止,此处展示捕获的异常信息。 比如调用一个任务的cancel方法,会展示下面的信息。
多进程 API 由于使用了新的多进程库处理工作,WorkManager 引入了新的 API,并进行了底层优化来帮助大型应用更有效地安排和执行工作。...不过单凭这一点,还不能称之拥有 "持久化" 特性,因此 WorkManager 在底层还使用了 Room 数据库来保证当进程被结束或设备重启后,您的工作仍然可以执行,并有可能从中断位置继续执行。...于是,回调中携带的信息就可以被用来生成一条通知。 有了这些辅助方法,我们就可以将 WorkManager 执行长时间运行工作所需要的 ForegroundInfo 实例保存起来。...在这段代码里,我们提供了一个 suspend 标记的 doWork 方法,其中调用了刚才提到的分块下载辅助方法。...您需要像平常那样实现一个 suspend 标记的 doWork 方法。需要注意的是,当您的应用占用了全部的配额后,加急作业可能会被中断。
WorkManager 提供了一系列 API 可以更加便捷地规划异步任务,即使在应用被关闭之后或者设备重启之后,仍然需要保证立即执行的或者推迟执行的任务被正常处理。...对于 Kotlin 开发者,WorkManager 为协程提供了最佳的支持。在本文中,我将通过实践 WorkManager codelab 为大家展示 WorkManager 中与协程相关的基本操作。...在这个 WorkManager codelab 教程中,我们会对图片进行模糊化处理,并且将处理后的数据存储在磁盘上。我们看一下这个过程中需要哪些操作。...work 请求,在本例中,我们希望整个操作仅运行一次,所以我们使用 OneTimeWorkRequest.Builder,将需要模糊化处理的图片的 Uri 作为参数传入。...如果您在 doWork() 里调用异步的 API 然后返回结果,那么您回调函数的执行可能会出现问题。 但是如果我希望进行异步操作怎么办?
但不合理的使用这些API,会造成消耗大量电量。JetPack中的WorkManager为应用程序执行后台任务提供了 一个统一的解决方案。...注: WorkManager并不是一种新的工作线程,工作线程通常立即执行,而WorkManager不能保证任务被及时执行。...这也是Android的碎片化所导致的,许多厂商修改了手机ROM,造成不能得到执行,因此,分析需求是否可以使用WorkManager。...使用 创建任务 使用Worker类定义任务,复写doWork(),在doWork()里执行耗时任务。...worker使用 .setInputMerger(null) //当一个任务被调度失败后,所要采取的重试策略,可以通过BackoffPolicy
为了不同的使用场景更易于适配,我们通过对 WorkManager 添加功能,提升了开发者在遵循后台任务限制方面的体验。 我们推荐使用 WorkManager 处理需立即执行的长时间运行任务。...(): ForegroundInfo { //每一个 Notification 需要使用不同的 id val notificationId = 1 return ForegroundInfo...否则在 setForeground() 被调用之前,您的 Worker 将会被视为非前台服务,这样可能会导致这个任务被取消或引起其余不希望出现的结果。...WorkManager 从基础到高级的各项特性: Android Jetpack WorkManager | Android 中文教学视频 WorkManager 在 Kotlin 中的实践 WorkManager...: 周期性任务 自定义 WorkManager —— 基础概念 使用 Dagger 自定义 WorkManager Google IssueTracker 提交所遇到的任何问题,这将帮助我们第一时间优化特性和修复漏洞
使用这个ID可以取消任务的执行,或者取得当前任务的执行状态。...约束类是可以在使用 WorkRequest.Builder 创建的时候进行传递给 WorkRequest。 WorkManager:工作任务管理器,它是用于管理工作任务的请求队列的类。...通过上面的描述,可以简单的画出下面的关系图: ? 0x02 实践篇——工作流 假设我们在开发一个图片相关的APP,这个应用需要期地压缩它存储的图片。我们使用 WorkManager来实现这个需求。...这时候, WorkManager在执行任务的时候就会考虑约束条件的情况。 取消任务 取消任务需要一个任务ID,可以通过 WorkRequest来获取。...在创建 WorkRequest 的时候,可以执行给它指定一个Tag;而另一个任务请求也可以设置相同的Tag。
这三个和WorkManager并不是替代的关系. 这三个工具, 能帮助你在应用中开后台线程干活, 但是应用一被杀或被关闭, 这些工具就干不了活了。...这种需求你应该使用ThreadPool”。 WorkManager实例 1....然后使用WorkManager将WorkRequest对象入列。...进阶 WorkManager 提供了一个接口让我们拿到结果, 这个东东就是 WorkStatus. 你可以由id得到你想要的那个任务的WorkStatus....5,插入任务时, 已经有相同的任务时, 怎么办? WorkManager可以用beginUniqueWork()来执行唯一工作队列(“unique work sequence”).
对于平常的使用,如果一个后台任务在执行的过程中,app突然退出或者手机断网,这时后台任务将直接终止。 典型的场景是:App的关注功能。...这就产生了操作上的bug,降低了用户的体验,增加了用户不必要的操作。 那么该如何解决呢?很简单,看WorkManager的定义,使用WorkManager就可以轻松解决。...当然你不使用WorkManager也能实现,这就涉及到它的另一个好处:简单。如果你不使用WorkManager,你就要对不同API版本进行区分。...其实它们本质都是实例化了一个WorkContinuationImpl,只是调用了不同的构造方法。...WorkManager支持两种方式来获取响应结果 Request.id: WorkRequest的id Tag.name: WorkRequest中设置的tag 同时返回的WorkInfo还支持LiveData
关于这个组件的介绍就不多说了,网上到处都是,这里分享一下在 WorkManager 中处理异步任务的方法。...我们知道,在 WorkManager 中,处理任务的方式是创建一个继承自 Worker 的任务类,实现 doWork() 方法,并在这个方法中实现我们自己的任务,然后返回 Result.success(...在这里, doWork() 方法中的任务应该是同步的,这是很自然的,因为 doWork() 方法本身就是在子线程中执行,因此可以在 doWork() 方法中同步执行耗时操作。...但是些情况,我们想要执行的是异步任务,在 WorkManager 中,有两种比较好的处理异步任务的方案。 RxWorker 很多时候我们会使用 RxJava 来处理数据。...(); mFuture.set(result); } }); return mFuture; } } 可以里面主要使用了 SettableFuture 这个类,在 startWork
service一直被用来做后台运行的操作,包括一些保活,上传数据之类的,这个后台运行的弊端很多,比如耗电,比如设计用户隐私之类的,谷歌对这些后台行为进行了一些处理,从Android Oreo(API 26...) 开始,如果一个应用的目标版本为Android 8.0,当它在某些不被允许创建后台服务的场景下,调用了Service的startService()方法,该方法会抛出IllegalStateException...所以,在不久的将来,service的使用范围会越来越小,取而代之的,是谷歌推出的新的技术:WorkManager。 WorkManager在工作的触发器 满足时, 运行可推迟的后台工作。...).getWorkInfosByTagLiveData(TAG); 使用id只能取消单个后台任务请求,而使用标签的话,则可以将同一标签名的所有后台任务请求全部取消。...每个唯一的工作序列都有一个名字,WorkManager一次只允许一个工作序列使用该名称,当我们创建一个新的唯一工作序列时,如果已经有一个未完成的序列具有相同的名称,则指定WorkManager应执行的操作
今天我们来讲以下google推荐我们使用jetpack进行后台任务处理的组件:workManager。...我们在开头就说了,workManager是一个可以用来进行后台任务的组件。...因为workManager比service强大太多,它可以在应用程序退出或者其他原因中止后,依然执行(本地任务如:本地图片的读取展示)或者应用程序打开后继续执行任务(网络请求)。...workmanager相关类 worker 一个抽象类,需要继承worker并重写doWork()方法来进行具体的逻辑代码。...workStatus 包含任务的状态和信息,以LiveData的形式提供给观察者。 data 在worker中用来存储数据,建造者模式,通过builder()来设置值,键值对存储。
WorkManager是用于后台执行任务的工具,相比于Service、JobSchedule等,它拥有很低的能耗,但是它不是立即执行任务的,对于一些不需要及时完成的任务,使用WorkManager是一个很好的选择...WorkManager内部使用了数据库,所以能保证任务一定会执行。...WorkManager的兼容性也很好,最低支持api14,api23以前,WorkManager内部是使用了JobSchedule,23以后使用的是AlarmManager+BroadCastReceiver...使用WorkManager需要添加gradle依赖: implementation 'androidx.work:work-runtime:2.5.0' 1.使用WorkManager 定义Work类...() { Log.i(TAG,"doWork"); return Result.success(); } } 在适当的地方,将任务入队: //设置条件
WorkManager v2.1 已经弃用了 WorkManager#getInstance() ,转而使用 WorkManager#getInstance(context: Context)。...数据的输入和输出 WorkManager 允许您传递一个 Data 对象给您的 Worker,同时在 success 和 failure 方法被调用时,也会返回一个新的 Data 对象给您 (由于在您返回...这种情况在只要不进行取消操作便不会到达最终状态的周期性任务身上尤其容易出现。 我们常说,即使您的应用被关闭或者设备被重启,WorkManager 仍会保证执行您的任务。...我只会在有恰当理由时才会使用 REPLACE 策略,比如,当我想要在某个 Worker 的 doWork() 方法中对它自己重新排期时。...使用 WorkManagerTestInitHelper,您可以在测试您的 Worker 类时模拟延迟、约束条件和周期要求被满足等情况。
Kotlin 编写的并使用了 KTX 库 (Kotlin Extensions)。...正如刚才所说,CoroutineWorker#doWork() 默认是在 Dispatchers.Default 启动的。您可以使用 withContext() 对此配置进行自定义。...您可以在 WorkManager 测试文档页面 和新的 使用 WorkManager 2.1.0 进行测试 的指南中了解更多相关信息。...现在您可以非常容易的对 Worker 类进行测试,并且 WorkManager 在 Kotlin 中的整体使用体验也非常棒。...如果您还没有在项目中使用 CoroutineWorker 以及 workmanager-runtime-ktx 中包含的其他扩展,强烈建议您在项目中使用它们。
在第一篇博文中,我们讨论了 WorkManager 是什么以及何时使用 WorkManager。...Default Executor:一个默认的执行程序,运行你的工作,除非你另行指定。这确保在默认情况下,你的工作是同步运行的,并且在主线程之外运行。 这些部分可以被重写以具有不同的行为。...所以在这样的情况下,不要使用 WorkManager —— 坚持使用像 Kotlin 协程那样轻量的东西或创建自己的 Executor。...id,该唯一 id 是查找关联 WorkInfo 的一种方法。...对于 Worker,这意味着 doWork() 方法已经被调用。 SUCCEEDED:当 doWork() 返回 Result.success() 时,工作进入这种最终状态。
工作线程通常能够立即执行,并在任务完成后将结果反馈给用户,而WorkManager不是即时的,它不能保证任务能够被立即执行。...后台延时任务 WorkManager能够保证任务一定会被执行,但不是不能保证被立即执行,也即说在适当的时候被执行。因为WorkManager有自己的数据库,与任务相关的信息和数据就保存到数据库中。...2.2 定义 Worker 创建一个继承自Worker的Worker类,然后在Worker类的doWork()方法中执行要运行的任务,并且需要返回任务状态的结果。...例如,在doWork()方法实现上传图像的 任务。...3.4 观察任务状态 在将任务加入到队列后,我们可以根据 name、id 或与其关联的 tag 在 WorkManager 中查询任务的相关信息,并且检查它的状态,涉及的方法有如下几个。
WorkStatus 包含有任务的状态和任务的信息,以 LiveData 的形式提供给观察者。 接下来是 WorkManager 的简单使用。...使用 WorkManager 的实现包括以下几个步骤。...,通过 id 可以获取到对应任务的 WorkStatus,并且是以 LiveData 形式提供的: WorkManager.getInstance() .getStatusById(request.id...,也是通过 id 实现的: WorkManager.getInstance().cancelWorkById(request.id) 复制代码 这样我们就完成了一个最简单的 WorkManager,执行一下就可以看到打印的结果了...更合理的后台任务管理 说了这么多,我想表达的是,在不久的将来,在某些情况下,Service 已经没卵用了!
Android11不光废弃了AsyncTask,还把IntentService一起废掉了,对于后台的异步服务,官方建议改为使用工作管理器WorkManager。...当然这些后台工具的用法各不相同,徒增开发者的学习时间而已,于是乎谷歌索性把它们统一起来,在Jetpack库中推出了工作管理器WorkManager。...因为WorkManager来自Jetpack库,所以使用之前要修改build.gradle,增加下面一行依赖配置: implementation 'androidx.work:work-runtime:...自定义的工作者必须实现构造方法,并重写doWork方法,其中构造方法可获得外部传来的请求数据,而doWork方法处理具体的业务逻辑。...最后在活动页面中集成工作管理器,运行测试App后点击启动按钮,观察到任务执行结果如下图所示,可见成功获知了后台工作的运行情况。
如果这些api没有被正确的使用,则可能导致消耗大量的电量。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方案,以便在设备电量和用户体验间达到一个比较好的平衡。...WorkManager有三个重要特点,分别如下: 1.针对的是不需要及时完成的任务 2.保证任务一定被执行 3.兼容范围广,最低能兼容API Level14 二.WorkManager的基本使用方法...() {//耗时的任务在doWork()方法中执行 Log.i("OneTimeWorkRequest","Work Start!")...3.使用WorkRequest配置任务 配置任务就是在告诉系统,任务在何时运行及如何运行,下面结合代码讲解 public class MainActivity extends AppCompatActivity...() (3)WorkManager.getWokInfosForUniqueWork() 如果希望实时获取任务的状态,这三个方法还有对应的LiveData方法,在方法后面加上LiveData
领取专属 10元无门槛券
手把手带您无忧上云