Android 任务调度 WorkManager 和 JobScheduler 的使用

在过去,常常使用后台Service来执行定时任务。虽然Service是执行后台任务的一种方式,但自Android 8.0(API级别26)以后,Google推荐使用更高效和系统友好的方式来执行定时任务,例如JobSchedulerWorkManager

使用Service执行定时任务可能存在以下问题:

  1. 耗电和性能:长时间运行的Service会持续消耗电池和设备资源。对于频繁的定时任务,Service可能会导致电池耗尽和性能下降。

  2. 后台执行限制:自Android 8.0开始,Android引入了后台执行限制。后台Service在设备空闲时执行的频率可能受到限制,因此不适合频繁的定时任务。

  3. 后台进程清理:为了优化设备性能和电池寿命,Android可能会清理后台进程,导致Service停止运行。

相比之下,JobSchedulerWorkManager提供了更加系统化的后台任务调度和执行,具有以下优点:

  1. 系统优化:JobSchedulerWorkManager会根据设备的使用情况和电池状态来智能调度任务,以避免过度耗电。

  2. 后台执行限制适配:JobSchedulerWorkManager能够适配Android的后台执行限制,并在适当的时候执行任务,而不会因为后台执行限制而停止。

  3. 灵活性:WorkManager支持链式任务、延迟执行、重试机制等特性,使得任务调度和执行更加灵活。

  4. 兼容性:JobSchedulerWorkManager兼容Android 5.0(API级别21)及以上的设备,覆盖了大部分Android设备。

总的来说,虽然Service可以用来执行定时任务,但JobSchedulerWorkManager提供了更加高效、系统友好的方式来执行后台任务,并能避免一些Service所面临的问题。因此,对于新的应用或需要定时任务的场景,推荐使用JobSchedulerWorkManager。对于一些旧的应用,如果已经在使用Service执行定时任务,并且没有出现性能和电池问题,可以继续使用。但对于新的开发,建议采用更先进的JobSchedulerWorkManager

  • WorkManager文档:https://developer.android.com/jetpack/androidx/releases/work?hl=zh-cn
  • JobScheduler文档:https://developer.android.com/reference/android/app/job/JobScheduler

WorkManager和JobScheduler对比

JobSchedulerWorkManager都是Android中用于调度和执行后台任务的API。它们各自有不同的特点和优势,适用于不同的使用场景。以下是它们的异同点和各自的优势:

异同点:

  1. 调度策略:JobSchedulerWorkManager都提供了智能的调度策略,可以根据设备状态、电池情况和网络连接等条件来优化后台任务的执行时间。

  2. 兼容性:JobSchedulerWorkManager都兼容Android 5.0(API级别21)及以上版本的设备。

  3. 后台执行限制:JobSchedulerWorkManager都能适应Android的后台执行限制,并在合适的时机执行任务。

  4. 任务约束条件:JobSchedulerWorkManager都支持设置任务的约束条件,例如网络连接、充电状态、设备空闲等,以确保任务在适当的条件下执行。

  5. 任务重试:WorkManager支持任务的重试机制,可以在任务失败时进行自动重试,从而提高任务的可靠性。

优势:

  1. JobScheduler的优势:

    • 内置系统:JobScheduler是Android系统的一部分,因此不需要导入其他库,可以直接使用。
    • 灵活的调度:JobScheduler提供了灵活的调度选项,可以设置延迟执行和重复执行等,适合处理不需要及时执行的后台任务。
  2. WorkManager的优势:

    • 后向兼容:WorkManager在Android Support库中提供,能够向后兼容到Android 5.0,使得较新的特性可以在更旧的Android版本上使用。
    • 链式任务:WorkManager支持链式任务,可以按照一定的顺序和条件执行多个任务,使得任务调度更加灵活。
    • 可靠性:WorkManager具备任务的重试机制和任务状态的存储,能够保证任务在设备重启或应用退出后仍能得到执行。
    • 灵活性:WorkManager支持WorkerLiveData的结合使用,可以实现更加灵活的任务执行和任务状态的观察。

综上所述,JobSchedulerWorkManager都是非常有用的后台任务调度API,选择使用哪个取决于您的需求和目标平台。如果您的应用目标平台是Android 5.0及以上,并且需要更灵活、稳定和功能丰富的后台任务调度,建议使用WorkManager。如果您只需要简单的后台任务调度,并且不想引入额外的库,JobScheduler可能是一个不错的选择。

WorkManager和JobSchedule限制

WorkManagerJobScheduler都是Android中用于调度和执行后台任务的API,它们各自有一些限制和使用注意事项。

WorkManager的限制:

  1. 最小重复间隔:WorkManager的最小重复间隔是15分钟。这意味着无法直接实现每分钟刷新的定时任务。

  2. 最小延迟:WorkManager的最小延迟是10ms。

  3. 后向兼容:WorkManager适用于Android 5.0(API级别21)及以上版本,不支持更旧的Android版本。

  4. 任务执行时机:WorkManager会根据设备状态、电池情况和网络连接等条件来智能地调度后台任务的执行时机。但是,WorkManager并不能保证任务会立即执行,它可能会在某些条件下推迟任务的执行。

  5. 任务最长执行时间:WorkManager对任务的最长执行时间有一定限制。如果任务执行时间超过系统阈值,任务可能会被强制停止。

JobScheduler的限制:

  1. 最小重复间隔:JobScheduler的最小重复间隔通常是一分钟(JobInfo.getMinFlexMillis()),但不保证精确的一分钟间隔。

  2. 后向兼容:JobScheduler适用于Android 5.0(API级别21)及以上版本。

  3. 任务约束条件:JobScheduler支持设置任务的约束条件,例如网络连接、充电状态、设备空闲等,但这些约束条件并不总是完全可靠。例如,当设备处于空闲状态时,可能会有其他后台任务正在执行,从而影响任务的执行时机。

  4. 任务执行时机:JobScheduler会根据设备状态、电池情况和网络连接等条件来智能地调度后台任务的执行时机。但是,与WorkManager一样,JobScheduler也不能保证任务会立即执行,它可能会在某些条件下推迟任务的执行。

总体而言,WorkManagerJobScheduler都是系统提供的用于调度和执行后台任务的API,它们对后台任务的执行时间和频率都有一定的限制。在选择使用哪个API时,需要根据具体的业务需求和设备性能来做出决策。如果需要更频繁、更精确的定时任务,可能需要考虑其他方式,比如使用HandlerTimerScheduledExecutorService

WorkManager 的使用

在Android中,要实现定时(1分钟)的后台任务,您可以使用JobSchedulerWorkManager,它们是Android系统提供的用于调度和管理后台任务的API。这些API可以确保任务在系统适当的时间执行,并且在设备休眠或应用处于后台时也能正常运行。

以下是使用WorkManager实现定时后台任务的代码示例:

  1. 首先,添加WorkManager的依赖到您的build.gradle文件:
implementation "androidx.work:work-runtime:2.7.0"
  1. 创建一个继承自Worker的后台任务类:
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;public class MyWorker extends Worker {public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {super(context, workerParams);}@NonNull@Overridepublic Result doWork() {// 在这里执行后台任务逻辑// 例如,可以更新服务器数据或执行其他需要在后台执行的任务// 返回Result.success()表示任务执行成功return Result.success();}
}
  1. 调度定时后台任务并执行:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.work.Constraints;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import java.util.concurrent.TimeUnit;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建约束条件:可选地设置任务的网络状态、电池状态等Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED) // 网络连接时才执行任务.setRequiresCharging(true) // 充电时才执行任务.build();// 创建定期执行的后台任务,间隔时间为1分钟PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(MyWorker.class, 1, TimeUnit.MINUTES).setConstraints(constraints) // 设置约束条件.build();// 调度后台任务WorkManager.getInstance(this).enqueue(workRequest);}
}

上述代码会在应用启动后,调度一个定时执行的后台任务,它会在1分钟的间隔内重复执行。同时,可以根据需要在Constraints中设置任务的约束条件,例如要求任务在有网络连接和设备充电时才执行。

通过使用WorkManager,您可以实现高效和灵活的后台任务调度,确保任务能够在合适的时机执行,同时遵循系统的优化和限制策略。

JobScheduler 的使用

以下是一个使用JobScheduler实现定时的后台任务代码示例:

  1. 创建一个继承自JobService的类来处理后台任务:
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.os.AsyncTask;
import android.util.Log;public class MyJobService extends JobService {private static final String TAG = "MyJobService";@Overridepublic boolean onStartJob(JobParameters params) {// 在这里执行后台任务,可以使用AsyncTask或其他方法new MyBackgroundTask().execute(params);// 任务执行完成后返回false,表示任务已经处理完毕return true;}@Overridepublic boolean onStopJob(JobParameters params) {// 如果任务在完成之前被停止,重新调度任务// 如果返回true,表示任务应该重新调度// 如果返回false,表示任务不需要重新调度return true;}private class MyBackgroundTask extends AsyncTask<JobParameters, Void, Void> {@Overrideprotected Void doInBackground(JobParameters... params) {// 在这里执行后台任务的逻辑// 这部分代码将在单独的线程中执行。// 任务完成后,记得调用jobFinished()释放资源。jobFinished(params[0], false);return null;}}
}
  1. AndroidManifest.xml中注册JobService
<serviceandroid:name=".MyJobService"android:permission="android.permission.BIND_JOB_SERVICE"/>
  1. 使用JobScheduler调度定时任务:
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取JobSchedulerJobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);// 设置JobService组件ComponentName componentName = new ComponentName(this, MyJobService.class);// 设置任务的约束条件,此处设置为网络连接时执行JobInfo jobInfo = new JobInfo.Builder(1, componentName).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setPeriodic(60 * 1000) // 设置任务的执行间隔为1分钟(以毫秒为单位).build();// 添加其他约束条件// builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);// builder.setRequiresCharging(true);// 调度任务jobScheduler.schedule(jobInfo);}
}

上述代码会在应用启动后,使用JobScheduler调度一个定时执行的后台任务,它会在1分钟的间隔内重复执行。在示例中,我们将任务的执行条件设置为任何网络连接时都执行。您可以根据需要在JobInfo.Builder中设置不同的约束条件,如设备充电时执行、设备处于空闲状态时执行等。

通过使用JobScheduler,您可以实现系统友好的后台任务调度,确保任务在合适的时机执行,同时遵循系统的优化和限制策略。

相关参考

http://www.manongjc.com/detail/60-imdjcxintlltpvb.html

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

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

相关文章

flask实现一个登录界面

flask实现一个登录界面 基础的Flask项目结构 forms.py&#xff1a;定义登录表单和表单字段的文件。templates/login.html&#xff1a;用于渲染登录表单的 HTML 模板文件。routes.py&#xff1a;定义应用的路由和视图函数的文件。__init__.py&#xff1a;创建并初始化 Flask 应…

Java Spring和Spring集成Mybatis

0目录 1.Spring 2.Spring集成Mybatis 1.Spring 特性 IOC&#xff1a;控制反转 AOP&#xff1a;面向切面 Spring组成部分 在SMM中起到的作用&#xff08;粘合剂&#xff09; Spring理念 OOP核心思想【万物皆对象】 Spring核心思想【万物皆Bean组件】 Spring优势 低侵入式 …

MySQL学习笔记 ------ 排序查询

一、语法 SELECT 查询列表 FROM 表名 【WHERE 筛选条件】 ORDER BY 排序列表 【ASC}DESC】&#xff1b;#支持多个排序条件&#xff0c;以逗号分隔 二、特点 1、ASC &#xff1a;升序&#xff0c;如果不写默认升序 DESC&#xff1a;降序 2、排序列表 支持 单个字段…

基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数

基于新浪微博海量用户行为数据、博文数据数据分析&#xff1a;包括综合指数、移动指数、PC指数三个指数 项目介绍 微指数是基于海量用户行为数据、博文数据&#xff0c;采用科学计算方法统计得出的反映不同事件领域发展状况的指数产品。微指数对于收录的关键词&#xff0c;在指…

Java运算符

大体上&#xff0c;与C语言差不多&#xff0c;不同的地方&#xff0c;我用红色字体标注了 算术运算符 1. 基本四则运算符&#xff1a;加减乘除模 ( - * / %) int a 10 ; int b 20 ; System . out . println ( a b ); // 30 System . out . println ( a - b…

数据结构--线性表2-1

目录 一、线性结构的定义 二、线性表的表示 三、顺序表的实现&#xff08;或操作&#xff09; 1、修改&#xff1a; 2、插入&#xff1a; 四、顺序表的运算效率分析&#xff1a;时间效率分析&#xff1a; 一、线性结构的定义 若结构时非空有限集&#xff0c;则有且仅有一个…

8 个线程池最佳实践和坑!使用不当直接生产事故!!

这篇文章我会简单总结一下我了解的使用线程池的时候应该注意的坑以及一些优秀的实践。拿来即用&#xff0c;美滋滋&#xff01; 1、正确声明线程池 线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明&#xff0c;避免使用Executors 类创建线程池&#xff0c;会有 OOM …

线性代数的学习和整理2:用EXCEL进行矩阵计算

目录 矩阵的各种概念 矩阵的维数 矩阵的基底 矩阵的列向量 矩阵的平直概念 矩阵的乘法的映射图 矩阵的秩 矩阵的乘法具有不可交换性 矩阵的模 矩阵的各种概念 矩阵的维数 &#xff08;a1,a2&#xff09;是2维的&#xff08;a1,a2,a3&#xff09;是3维的&#xff08;a…

一文复习Java基础面试知识

申明&#xff1a;本人于公众号Java筑基期&#xff0c;CSDN先后发当前文章&#xff0c;标明原创&#xff0c;转载二次发文请注明转载公众号&#xff0c;另外请不要再标原创 &#xff0c;注意违规 Java基础知识 1、基本数据类型 在Java中&#xff0c;共有八种基本数据类型&…

基于深度学习淡水鱼体重智能识别模型研究

工作原理为&#xff1a;首先对大众淡水鱼图片进行数据清洗并做标签分类&#xff0c;之后基于残差网络ResNet50模型进行有监督的分类识别训练&#xff0c;获取识别模型。其次通过搭建回归模型设计出体重模型&#xff0c;对每一类淡水鱼分别拟合出对应的回归方程&#xff0c;将获…

Ubuntu ImportError: No module named ‘_tkinter‘问题解决方式

尝试安装tkinter模块.出现以下问题 sudo pip3 install tkinter [sudo] password for Ns3: DEPRECATION: Python 3.5 reached the end of its life on September 13th, 2020. Please upgrade your Python as Python 3.5 is no longer maintained. pip 21.0 will drop support …

go 排序 接口排序

Go sort 包主要提供了三种排序能力&#xff1a; &#xff08;1&#xff09;基本类型切片排序&#xff1b; &#xff08;2&#xff09;任意类型切片排序 &#xff1b; &#xff08;3&#xff09;任意数据结构排序 (实现接口方法排序) 一、基本类型切片排序 为了便于对常用数据…

Android OpenGL ES Camera2 实现实时抠图效果

前面文章人像抠图 + OpenGL ES 还能这样玩?没想到吧,我们介绍了利用人像抠图算法生成的 mask 图,然后结合 OpenGL 可以产生一些有趣的效果。 抠图技术应用很广泛,比如很多手机的相机自带“人像留色”滤镜:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在…

java后端接口实现302跳转

正常来说&#xff0c;接口返回String是"redirect:"url或者“r:”url就能实现前端接收到返回后自动302.但是我在自己的一个项目中这么写了之后发现返回的是纯字符串&#xff0c;很奇怪。 最后发现&#xff0c;如果你的controller层有RestController注解&#xff0c;那…

【vue】Vue中解读关于this.$emit()的用法:

文章目录 一、Vue.sync修饰符与this.$emit(‘update:xxx‘, newXXX)二、this.$emit()传多个参数 一、Vue.sync修饰符与this.$emit(‘update:xxx‘, newXXX) 二、this.$emit()传多个参数

Qt Core学习日记——第八天QMetaObject(下)

QMetaObject::normalizedType 将名称规范化。 例如&#xff1a; QByteArray normType QMetaObject::normalizedType(" int const *"); // normType is now "const int*" QMetaObject::connect(const QObject *sender, int signal_index, const QObject…

Langchain 的 ConversationSummaryBufferMemory

Langchain 的 ConversationSummaryBufferMemory ConversationSummaryBufferMemory 在内存中保留最近交互的缓冲区&#xff0c;但不仅仅是完全刷新旧的交互&#xff0c;而是将它们编译成摘要并使用两者。但与之前的实现不同的是&#xff0c;它使用令牌长度而不是交互次数来确定何…

Jmeter性能测试配置

Jmeter检查点/断言 在上一章节中&#xff0c;我们通过调试脚本&#xff0c;通过人工验证脚本可以完成业务功能&#xff0c; 但在性能测试中&#xff0c;我们希望能通过自动验证脚本是否完成业务功能&#xff0c;在Jmeter 中我们可以通过检查点&#xff0c;也就是断言来实现自动…

【R3F】0.8drei使用

安装引用 npm install @react-three/drei@9.50 //这里是为了和之前版本对应控制器 通过 three/examples/jsm/controls/OrbitControls.js 引入使用 查看 通过 @react-three/drei 方式很简单直接添加上对应的节点就可以可以了 import {OrbitControls, TransformControls } from …

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段&#xff0c;VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用&#xff0c;每天都有不少人通过VR全景展示来了解酒店的设施环境&#xff0c;而酒店也可以借此机会&#xff0c;详细展示自身优势&#xff0c;更大范围吸引顾客。 VR酒店拥有真实、立体的全…