前言一般情况下,我们的大部分操作都是在app打开时进行的,但在某些情况下,即使app关闭了,我们也可能需要进行一个必要的动作执行,或者将采取行动,而不是让用户等待它加载,我们可以在后台完成并通知用户结果。针对这些在日常工作中经常出现但又非常棘手的情况,学习使用workManager将帮助您轻松解决这些问题。WorkManager是一种API,可让您轻松安排可靠的异步任务,这些任务即使在退出应用程序或重启设备后也应运行。WorkManagerAPI适合替代所有以前的Android后台调度API(包括FirebaseJobDispatcher、GcmNetworkManager、JobScheduler等),我建议您这样做。WorkManager将其前身的功能合并到一个现代、一致的API中,该API支持14及更高版本,并且在开发时会影响电池寿命等。何时使用WorkManagerWorkManager处理满足各种约束时需要运行的后台工作,无论应用程序进程是否处于活动状态。后台工作可以在应用程序处于后台、应用程序处于前台或应用程序在前台启动但转到后台时启动。无论应用程序在做什么,后台工作都应该继续,或者如果Android终止其进程则重新启动。关于WorkManager的一个常见混淆是,它用于需要在“后台”线程中运行但不需要在进程死亡后继续存在的任务。不是这种情况。对于此用例,还有其他解决方案,如Kotlin的协程、线程池或RxJava等库。许多不同的情况需要运行后台工作,因此运行后台工作有不同的解决方案。够不够用?对于WorkManager,最适合用于必须完成且可延迟的后台工作。首先问问自己:这个任务需要完成吗?如果应用被用户关闭,任务还需要完成吗?一个示例是具有远程同步功能的笔记应用程序;端服务器同步。即使切换到另一个应用程序时也会发生这种情况,并且操作系统需要关闭该应用程序以回收一些内存。即使在重新启动设备后也应该发生。可以通过WorkManager确保任务完成。这个任务可以延期吗?我们可以稍后运行的任务,或者直接运行它是否有用?如果一个任务可以稍后运行,那么它就是可延迟的。看前面的例子,即时上传即时笔记是比较理想的,但是由于网络限制等原因,无法与编辑同步,不过这也不是什么大问题,毕竟主流应用的用户习惯是像这样。并且由于WorkManager尊重操作系统的后台限制,尽量以省电的方式运行你的工作,这也是延迟任务选择WorkManager的最佳选择之一。WorkerManager的工作流在后台,WorkManager根据以下条件使用底层作业来调度服务:WorkRequest我们可以创建两种类型的工作请求。OneTimeWorkRequest→当我们只处理一次PeriodicWorkRequest时→当我们每隔一定的时间间隔做WorkerCoroutinework挂起一个DoWork时,我们可以通过在运行过程中执行必要的处理函数来处理这个函数的成功和失败情况。工人初始化简单的过程。我们指定它将使用OneTimeWorkRequest和我们的Worker类作为参数触发一次。我们>运行使用WorkManager创建的workRequest。doWork函数将在Worker被触发时运行。向Worker发送数据在构造WorkRequest之前,我们可以设置很多值,其中一个就是setInputData()参数,这个参数足以发送属于androidx.work的Data。在Worker类中,我们可以获得与inputData及其键一起发送的值。约束我们可以使用setConstraints()设置一些条件,以便在运行worker之前进行检查。setRequiresDeviceIdle→如果我们希望它在进入Doze模式时工作,我们只需将其设置为true。默认为假。setRequiresNetworkType→我们可以设置互联网连接状态。setRequiresBatteryNotLow→如果电池电量不低,我们可以设置它的状态。默认为假。setRequiresCharging→插头状态。默认为假。Delay部分对于OneTimeRequest会起作用一次,对于临时工也是一样的,但是这个延时不会每次触发都起作用。WorkerStateObserve我们可以通过状态来观察我们在Worker中正在做的过程,方法不止一种,我们可以在它们之间进行选择。getWorkInfosByTagLiveData—>getWorkInfosForUniqueWorkLiveData—>getWorkInfoByIdLiveData我比较喜欢用workRequest的id来观察。通过在Worker中将数据分配到成功和失败状态,我将能够再次接收数据并观察它。临时工的工作方式与OneTime类似,只是我们需要指定动作时间。但!会有一个问题,如果设备处于休眠模式,进程会被挂起;当设备被唤醒时,该过程将按顺序再次处理。如果希望能够准确的操作进程,需要给manifest文件添加权限。uses-permissionandroid:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>官方文档:https://developer.android.com/topic/libraries/architecture/workmanagerhttps://bugrayetkinn.medium.com/android-workmanager-6bc60dcd17fdhttps://android-developers.googleblog.com/2018/10/modern-background-execution-in-android.html
