JobScheduler

JobScheduler是Android L(API21)新增的特性,用于定义满足某些条件下执行的任务。它的宗旨是把一些不是特别紧急的任务放到更合适的时机批量处理,这样可以有效的节省电量。

为什么需要JobScheduler

Android在进入待机状态时,会不断关闭各种硬件来延长手机的待机时间,首先屏幕会逐渐变暗直至关闭,然后CPU进入睡眠,这一切操作都是为了节约宝贵的电量资源。但是即使在这种睡眠状态下,大多数应用还是会尝试进行工作,他们将不断的唤醒手机。

在Android性能优化的电量篇中通过Battery Historian查看手机的耗电状况,可以知道Android的在蜂窝数据下电量消耗呈现间隔小,又频繁断断续续的出现,说明电量消耗性能很不好:

 
图片

在WiFi连接下,网络传输的电量消耗要比移动网络少很多,应该尽量减少移动网络下的数据传输,多在WiFi环境下传输数据。

 
图片

如何把任务缓存起来,做到批量执行,就是Job Scheduler了,应用需要做的事情就是判断哪些任务是不紧急的,可以交给Job Scheduler来处理,Job Scheduler集中处理收到的任务,选择合适的时间,合适的网络,再一起进行执行。

输入法中通知中心中的很多任务可以放到JobScheduler来,该API在21中引入,目前输入法的minSDK为14。

怎么使用JobScheduler

使用起来很简单,核心就是自己定义一个JobService(该service运行在主线程),在onStartJob中完成具体的业务逻辑,然后构建JobInfo来设定一些运行的场景和条件,最后放到系统服务JobScheduler中去,系统在指定的场景就会触发service。

  1. 创建JobService

     public class JobSchedulerService extends JobService {
    
    @Override
    public boolean onStartJob(JobParameters params) { return false;
    } @Override
    public boolean onStopJob(JobParameters params) { return false;
    }
    }

    我们创建一个继承自JobService且名字为JobSchedulerService的类,这个类必须实现两个方法,分别是onStartJobonStopJob,当任务开始时会执行onStartJob方法,因为这是系统用来触发已经被执行的任务。正如你所看到的,这个方法返回一个boolean值。如果返回值是false,系统假设这个方法返回时任务已经执行完毕。如果返回值是true,那么系统假定这个任务正要被执行,执行任务的重担就落在了你的肩上。当任务执行完毕时你需要调用jobFinished来通知系统。

    当系统接收到一个取消请求时,系统会调用onStopJob方法取消正在等待执行的任务。
    其实onStopJobjobFinished正常调用结束一个job时,也是不会调用的,只有在该job没有被执行完,就被cancel掉的时候回调到,比如某个job还没有执行就被JobSchedulerCancel掉时,或者在某个运行条件不满足时,比如原来在Wifi环境允许的某个任务,执行过程中切换到了非Wifi场景,那也会调用该方法。改方法也返回一个boolean值,返回true表示会重新放到JobSchedulerreScheduler,false表示直接忽略。

  1. 设置执行条件

想创建定时任务时,你可以使用JobInfo.Builder来构建一个JobInfo对象,然后传递给你的ServiceJobInfo.Builder接收两个参数,第一个参数是你要运行的任务的标识符,第二个是这个Service组件的类名。

     JobInfo.Builder builder = new JobInfo.Builder(i, mServiceComponent)
.setMinimumLatency(2000) // 设置任务允许最少延迟时间
.setOverrideDeadline(50000) // 设置deadline,若到期还没有到达规定的条件也会执行
.setRequireNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) //设置网络条件,非蜂窝数据的
.setRequiresCharging(true) // 设置充电条件
.setRequiresDeviceIdle(false) // 设置手机是否idle状态
.build(); 其他设置方法 :
  • setMinimumLatency(long minLatencyMillis):
    这个函数能让你设置任务的延迟执行时间(单位是毫秒),这个函数与setPeriodic(long time)方法不兼容,如果这两个方法同时调用了就会引起异常;

  • setOverrideDeadline(long maxExecutionDelayMillis):
    这个方法让你可以设置任务最晚的延迟时间。如果到了规定的时间时其他条件还未满足,你的任务也会被启动。与setMinimumLatency(long time)一样,这个方法也会与setPeriodic(long time),同时调用这两个方法会引发异常。

  • setPersisted(boolean isPersisted):
    这个方法告诉系统当你的设备重启之后你的任务是否还要继续执行。

  • setRequiredNetworkType(int networkType):
    这个方法让你这个任务只有在满足指定的网络条件时才会被执行。默认条件是JobInfo.NETWORK_TYPE_NONE,这意味着不管是否有网络这个任务都会被执行。另外两个可选类型,一种是JobInfo.NETWORK_TYPE_ANY,它表明需要任意一种网络才使得任务可以执行。另一种是JobInfo.NETWORK_TYPE_UNMETERED,它表示设备不是蜂窝网络( 比如在WIFI连接时 )时任务才会被执行。

  • setRequiresCharging(boolean requiresCharging):
    这个方法告诉你的应用,只有当设备在充电时这个任务才会被执行。

  • setRequiresDeviceIdle(boolean requiresDeviceIdle):
    这个方法告诉你的任务只有当用户没有在使用该设备且有一段时间没有使用时才会启动该任务。

    需要注意的是setRequiredNetworkType, setRequiresCharging 和 setRequiresDeviceIdle这几个方法可能会使得你的任务无法执行,除非调用setOverrideDeadline(long time)设置了最大延迟时间,使得你的任务在为满足条件的情况下也会被执行。

  1. 创建JobScheduler对象,并把JobInfo交给它管理

     mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    xxxxxxx
    if(mJobScheduler.schedule(builder.build()) <= 0 ) {
    // if something goes wrong
    }

JobScheduler是个系统Service,我们的将自己的JobInfo传给它,由系统负责调用,其中这个schedule方法会返回一个整型。如果schedule方法失败了,它会返回一个小于0的错误码。否则它会我们在JobInfo.Builder中定义的标识id。

如果你的应用想停止某个任务,你可以调用JobScheduler对象的cancel(int jobId)来实现;如果你想取消所有的任务,你可以调用JobScheduler对象的cancelAll()来实现。

参考

Android App耗电
Android耗电统计算法
理解JobScheduler机制

作者:Skywalker_Yang
链接:https://www.jianshu.com/p/1d4ebae39263
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【转】JobScheduler的更多相关文章

  1. Spark Streaming源码解读之JobScheduler内幕实现和深度思考

    本期内容 : JobScheduler内幕实现 JobScheduler深度思考 JobScheduler 是整个Spark Streaming调度的核心,需要设置多线程,一条用于接收数据不断的循环, ...

  2. JobScheduler

    任务写在JobService中 public class TestJobService extends JobService { private static final String TAG = & ...

  3. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  4. Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘

    Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...

  5. 安卓电量优化之JobScheduler使用介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.JobScheduler概述 JobScheduler是安卓5.0版本推出的API,允许开发者在符合某些条件时创建执行在后台的任务.在Andro ...

  6. INFO JobScheduler: Added jobs for time 1524468752000 ms/INFO MemoryStore: Block input-0-1524469143000 stored as bytes in memory/完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行

    1.完全分布式  ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行: 1 [hadoop@slaver1 spark- ...

  7. Elastic-Job-Lite分析——作业调度器 JobScheduler 的创建过程

    -----------------------------------1. 创建注册中心的对象----------------------------------------------------- ...

  8. 在Android 5.0中使用JobScheduler(转载)

    翻译见:http://blog.csdn.net/bboyfeiyu/article/details/44809395 In this tutorial, you will learn how to ...

  9. JobScheduler调度器过程(JobSchedulerService的启动过程)

    JobSchedulerService启动过程,最主要工作是从jobs.xml文件收集所有的jobs,放入到JobStore的成员变量mJobSet,转成jobinfo. JobScheduler服务 ...

  10. JobScheduler android任务调度处理组件(类似QuartZ)

    JobScheduler是Android L(API21)新增的特性,用于定义满足某些条件下(电量,网络,时间,屏幕熄/亮 ,设备是否空闲 等)执行的任务.它的宗旨是把一些不是特别紧急的任务放到更合适 ...

随机推荐

  1. ajax异步加载问题

    使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.

  2. mysql优化----explain的列分析

    sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...

  3. mpvue——实现点击数组内的某一元素进行置顶(排序第一)操作

    前言 其实很简单只是用了js的几个函数 substr unshift splice 完整代码 | mpvue模仿QQ 代码 思路很简单,获取当前元素下标然后通过unshift函数将该值插入到数组第一位 ...

  4. SILVERLIGHT实现对HTML DOM的访问

    实现对HTML DOM的访问.Silverlight 2在命名空间System.Windows.Browser下内置了很多对于HTML DOM访问和操作的支持,我们最常用的一个对象是HtmlEleme ...

  5. codeforces 690C3 C3. Brain Network (hard)(lca)

    题目链接: C3. Brain Network (hard) time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  6. 深入研究 Java Synchronize 和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  7. 聊聊Web App、Hybrid App与Native App的设计差异(转)

    目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...

  8. k8s-存储卷1-十二

    因为pod是有生命周期的,pod一重启,里面的数据就没有了.所以我们需要数据持久化存储. 在k8s中,存储卷不属于容器,而是属于pod.也就是说同一个pod中的容器可以共享一个存储卷. 存储卷可以是宿 ...

  9. ccflow_002.表单引擎与流程引擎的关系

    本节主要内容 表单.数据.流程引擎的关系 图形展示三者之间的关系 流程编号和节点编号命名规则 这里的206就是这个流程的编号 2601:01就是当前节点的编号 流程编号206转换为int类型之后加上0 ...

  10. [msf]CentOS VPS创建pptpd 并搭建msf

    安装pptpd服务 vps下 下载 centos 6 一键安装包 wget --no-check-certificate https://raw.githubusercontent.com/teddy ...