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

自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。JobScheduler 可实现控制和简洁性。

schedule用法过程说明:

一   创建继承于JobService的对象(该service运行在主线程

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

 1  在onStartJob中完成具体的业务逻辑

     当任务开始时会执行onStartJob方法,因为这是系统用来触发已经被执行的任务。这个方法返回一个boolean值。如果返回值是false,系统假设这个方法返回时任务已经执行完毕。如果返回值是true,那么系统假定这个任务正要被执行。当任务执行完毕时你需要调用jobFinished来通知系统。

     2   当系统接收到一个取消请求时,系统会调用onStopJob方法取消正在等待执行的任务


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

二  创建JobInfo对象(采用builder模式),设置监听任务执行的条件(监听电量,网络,时间,屏幕亮/熄,设备是否空闲 等)

创建定时任务时,你可以使用JobInfo.Builder来构建一个JobInfo对象,然后传递给Scheduler底层的jobSchedulerService。

JobInfo.Builder接收两个参数,第一个参数是你要运行的任务的标识符ID,第二个是这个JobService组件的类名

1  ComponentName jobService = new ComponentName(this, MyJobService.class); //JobService组件的名包裹

2  JobInfo jobInfo = new JobInfo.Builder(123, jobService) //任务Id等于123

.setMinimumLatency(5000)// 任务最少延迟时间

.setOverrideDeadline(60000)// 任务deadline,当到期没达到指定条件也会开始执行 

.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 网络条件,默认值NETWORK_TYPE_NONE

.setRequiresCharging(true)// 是否充电

.setRequiresDeviceIdle(false)// 设备是否空闲

.setPersisted(true) //设备重启后是否继续执行

.setBackoffCriteria(3000,JobInfo.BACKOFF_POLICY_LINEAR) //设置退避/重试策略

.build();

三  先获取JobScheduler调度器的代理对象(要理解这个过程,那么就需要先看看JobSchedulerService的启动过程)

JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

对象里面主要有schedule(jobinfo对象执行条件) 启动:

scheduler.schedule(jobInfo);

有cancel(job任务id) 取消:

scheduler.cancel(123); //取消jobId=123的任务

scheduler.cancelAll(); //取消当前uid下的所有任务

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

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

 

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

https://www.cnblogs.com/softwarelanguagebs/p/9531562.html

JobScheduler android任务调度处理组件(类似QuartZ)的更多相关文章

  1. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

  2. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  3. 详解 Android 的 Activity 组件

    Activity 的生命周期 和 J2ME 的 MIDlet 一样,在 android 中,Activity 的生命周期交给系统统一管理.与 MIDlet 不同的是安装在 android 中的所有的 ...

  4. Android应用程序组件Content Provider的共享数据更新通知机制分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6985171 在Android系统中,应用程序组 ...

  5. Android应用程序组件Content Provider的启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6963418 通过前面的学习,我们知道在Andr ...

  6. Android开发四大组件概述

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity具体解释 二.Service具体解释 三.Broadcast Receiver具体解释 四.Content Provid ...

  7. Android Navigation 架构组件入门教程

    Android Navigation 架构组件入门教程 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:https://www.cnblogs.com/cavalier-/p/1 ...

  8. 改造 Android 官方架构组件 ViewModel

    前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, ...

  9. [Android Pro] 终极组件化框架项目方案详解

    cp from : https://blog.csdn.net/pochenpiji159/article/details/78660844 前言 本文所讲的组件化案例是基于自己开源的组件化框架项目g ...

随机推荐

  1. Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题

    实体类中日期定义的是Date类型的,没毛病: 我在mybatis里面定义的是Date类型的,进行测试的时候发现,数据库插入的日期的时分秒全部都是一样的,都是12:00:00,很郁闷: 后来把mybat ...

  2. maven打包某个分支的包

    maven打某个分支的包命令: mvn clean install -Dmaven.test.skip=true -Pdevelop

  3. 用cglib包来为类产生动态代理类对象

    一:在JDK里也有动态代理的类和接口,是Proxy和InvocationHandler,但是Proxy只能为接口产生代理类,借助InvocationHandler的实现类来完成对类对象的代理: 但是在 ...

  4. AngularJS实战之Controller之间的通信

    我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式 一.使用$on.$emit和$broadcast进行controller通信 虽然AngularJ ...

  5. Codeforces Round#415 Div.2

    A. Straight «A» 题面 Noora is a student of one famous high school. It's her final year in school - she ...

  6. bzoj2893(费用流)

    先缩点,然后拆点,其实是很经典的一种操作,把不好做的点拆成边,然后我一开始想的是网络流,答案当然是增广次数, 但可以发现跑网络流的话不同的跑法增广次数不一样,不太好找最小的.我们可以换一种神奇的思路, ...

  7. android Activity中设置setResult 没有触发onActivityResult

    昨天修改<manifest 文件中activity 的 模式为单例模式:android:launchMode="singleTask" ,发现我的onActivityResu ...

  8. jQuery插件初级练习2答案

    html: $.font($("p"),"30px").html("变化了") jQuery: $.extend({ font:functi ...

  9. iOS处理视图上同时添加单击与双击手势的冲突问题

    _bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...

  10. 增加显示记录数的label及隐藏refresh按钮

    1. 在UniDBgrid的extEvent属性中写入以下代码: function OnAfterCreate(sender) { var toolbar=sender.getDockedItems( ...