1.简介

  在Android 5.0 提供了一套新的 JobScheduler API,它允许您定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命。

  https://developer.android.com/reference/android/app/job/package-summary

  https://developer.android.com/reference/android/app/job/JobScheduler

  https://developer.android.com/reference/android/app/job/JobService

2.关键类

  JobInfo 描述任务,包含各个参数.

  JobScheduler 管理任务:布置、撤销、更新等.

  JobService 执行任务的服务组件.

2.1  JobScheduler

int schedule (JobInfo job)

布置一个任务,如果任务的id相同,后者覆盖前者,如果前者正在运行,它会被打断.

布置失败返回 RESULT_FAILURE ,可能job的参数有错误

布置成功返回RESULT_SUCCESS

void cancel (int jobId)

撤销指定id的任务,如果任务正在运行,它立刻停止.由于是用户手动撤销,所以任务的 onStopJob 的返回值没

有意义,被忽略.

void cancelAll ()
撤销所有任务. 
int enqueue (JobInfo job,JobWorkItem work)

布置任务和工作内容,如果该任务不存在,则添加一个新的任务.如果该任务正在运行,会被中断并以新的内容

添加到队列中.

如果jobInfo使用JobInfo.Builder.setExtras(PersistableBundle)等添加了附加数据,要保持它们一致,

使用JobInfo.Builder.setClipData(ClipData, int)添加数据后的任务永远被视为新任务,即使ClipData相同.

JobInfo getPendingJob (int jobId)
 根据id查找任务.
List<JobInfo> getAllPendingJobs ()
 返回当前应用布置的所有任务.(包括已经启动的和等待中的)

2.2 JobInfo及JobInfo.Builder

  JobInfo.Builder 构造jobinfo,设置任务的各项参数.如网络类型,运行周期等.

JobInfo build () 生成一个JobInfo对象
setBackoffCriteria (long initialBackoffMillis,int backoffPolicy)

设置回退策略,与setRequiresDeviceIdle(boolean)冲突.

initialBackoffMillis 是失败后的等待时间,

backoffPolicy 是回退方式,有BACKOFF_POLICY_LINEAR BACKOFF_POLICY_EXPONENTIAL 两种.

setEstimatedNetworkBytes (long downloadBytes, long uploadBytes)

预算任务网络连接时使用的字节数,如果知道具体字节最好,如果不是固定的可用JobInfo.NETWORK_BYTES_UNKNOWN

setExtras (PersistableBundle extras) 设置额外数据, PersistableBundle 里要放基本类型的数据.
setImportantWhileForeground (boolean importantWhileForeground) 是否临时加入白名单,在变成前台重要任务.默认false.
setMinimumLatency (long minLatencyMillis) 设置最小延迟时间,与 setPeriodic 冲突.
setOverrideDeadline (long maxExecutionDelayMillis) 最后执行期限,条件不满足也执行.与 setPeriodic 冲突.
setPeriodic (long intervalMillis) 设置任务执行周期,单位毫秒.
setPeriodic (long intervalMillis, long flexMillis)
setPersisted (boolean isPersisted) 设置是持久任务,开机后仍然有效.
setPrefetch (boolean prefetch) 设置任务是否预读本地内容,如果是,则系统会放宽网络类型约束.
setRequiredNetwork (NetworkRequest networkRequest)

设置任务使用的网络类型,如果无联网,不要调用这个方法,默认是null,这是一个非常严厉的约束,如果网络类型不满足,

任务不会被执行.这个方法有重载,只调用其中一个就可,重复调用后面的会覆盖前面的.

常用的类型:

NETWORK_TYPE_NONENETWORK_TYPE_ANYNETWORK_TYPE_UNMETEREDNETWORK_TYPE_NOT_ROAMING or NETWORK_TYPE_METERED.

setRequiredNetworkType (int networkType)
setRequiresBatteryNotLow (boolean batteryNotLow)  是否只在非低电量情况下运行,true表示在非低电量运行,默认false.
setRequiresCharging (boolean requiresCharging) 设置是否只在充电时运行.默认fase.注意系统在特别繁忙时,可能忽略usb充电,这时任务不会被执行.
setRequiresDeviceIdle (boolean requiresDeviceIdle) 在空闲时运行,默认fase,这里的空闲状态是个宽泛的系统定义,通常指在没有应用与用户交互时.
setRequiresStorageNotLow (boolean storageNotLow) 非低存储空间时运行.默认false.
setTransientExtras (Bundle extras) 给任务添加临时数据,与setPersisted冲突.
addTriggerContentUri (JobInfo.TriggerContentUri uri)

添加内容触发器,监听某个内容,它变化后才执行这个任务,uri指定要被ContentObserver监听的内容,与setPeriodic(long) or setPersisted(boolean)冲突.如:

       JobInfo.Builder builder = new JobInfo.Builder(JobIds.PHOTOS_CONTENT_JOB,
                 new ComponentName("com.example.android.apis", PhotosContentJob.class.getName()));
         // Look for specific changes to images in the provider.
         builder.addTriggerContentUri(new JobInfo.TriggerContentUri(
                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                 JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
         // Also look for general reports of changes in the overall provider.
         builder.addTriggerContentUri());
         JOB_INFO = builder.build();
setTriggerContentMaxDelay (long durationMs)

设置内容变化到任务被布置间的最大延迟(毫秒).

setTriggerContentUpdateDelay (long durationMs)

设置内容变化到任务被布置间的延迟(毫秒).

If there are more changes during that time,the delay will be reset to start at the time of the most recent change.

  JobInfo常用的方法是一些get方法,如getRequiredNetwork () , getBackoffPolicy () , isPeriodic () 等.

2.3 JobService

  以startService方式启动服务,其中几个重要方法:

boolean onStartJob (JobParameters params)

当scheduler添加调度任务后,任务开始执行时产生这个回调,默认在主线程.

注意这个参数,它里面保存了传来的数据.通常要保存它,当任务完成时,手动调用jobFinished

时使用.

返回true表示任务在手动调用jobFinished结束或系统条件不满足而停止前一直在活跃状态,

服务断续运行,这时系统为这个任务保留wakelock锁.直到jobFinished或onStopJob调用.

返回false表示任务正常结束,这时系统会释放与这个任务关联的wakelock锁.

如果任务简短并且同步的那么应该返回false,如果异步的应用在任务完成后手动调用jobFinished

boolean onStopJob (JobParameters params)

来自系统的结束任务通知.通常在任务执行条件不能被满足时产生这个回调,如:当你在构造任务时

指定了网络条件是wifi,在任务执行期间你关掉了wifi.

注意:一定要处理这条信息,如释放不用的资源,否则应用会产生异常行为.

返回true表示你还希望在按照构造里指定的重试策略重试,当这个任务里有多条工作内容时,

要返回true,表示这个任务需要重新布置执行未完成的工作..

返回false表示结束不重试,但是不管返回什么,当前这个任务必需停止.

void jobFinished (JobParameters params,boolean wantsReschedule)

当任务完成后,手动调用这个方法通知系统任务完成,然后系统释放相应的wakelock锁,

第1个参数是 onStartJob 传来的参数.

第2个参数表示是否尝试回滚策略,如果是不得以要执行的这个方法,true表示按构造时指定的回滚

策略重新安排.

默认的回滚策略不会让任务在系统睡眠期间执行,而只是把它重新添加到任务队列中,在系统修整维护期间

才执行这个任务.

3.实现进程保活?不可靠!

  如果想用JobService实现进程保活,那么就得设置任务为周期任务,有几个问题,证明用它实现进程保活不可靠.

  • 在最近应用列表点全部清除后,进程会被杀死,周期任务被停止.
  • 在api小于24时,不支持周期任务,只能自己用timer实现,同时要求JobService这个服务组件开启重启功能,但是这个功能不在在所有系统上都能顺利进行,如在emui,和miui上都被拒绝.emui:
    6-11 15:47:42.292 1494-13224/? I/HwPFWLogger: AppAutoStartupPolicy:prevent scheduleRestart service of package com.example.android.jobscheduler, serviceInfo com.example.android.jobscheduler.service.MyJobService
    06-11 15:48:12.311 1494-1494/? I/HwPFWLogger: AppAutoStartupPolicy:prevent start package com.example.android.jobscheduler, serviceInfo com.example.android.jobscheduler.service.MyJobService by callerPid 1494, callerUid 1000, scene:jobService

    miui:

    06-11 16:45:05.849 1432-1443/system_process I/ActivityManager:   Force stopping service ServiceRecord{bf9fd5e u0 com.example.android.jobscheduler/.service.MyJobService}
    06-11 16:45:06.147 1432-1447/system_process I/AutoStartManagerService: MIUILOG- Reject service :Intent { cmp=com.example.android.jobscheduler/.service.MyJobService } userId : 0 uid : 10127
  • 而api大于23时,最小周期是15分钟,这对于实时任务来说又有点长.

4.示例

4.1 相关权限

常用权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

必用权限:

    <service android:name="MyJobService"
              android:permission="android.permission.BIND_JOB_SERVICE" >
         ...
    </service>

4.2 下载代码

  https://gitee.com/xi/JobService.git

JobScheduler布置后台任务以及实现进程保活?的更多相关文章

  1. 转: android app进程保活的文章列表

    1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...

  2. Android--使用JobService实现进程保活

    进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径. 先来看看android中有几种进程 ...

  3. JobService和JobScheduler机制在Android5.0以上保活

    JobService和JobScheduler机制在Android5.0以上保活 我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致非常多不光明的手段来进行++保活++.但 ...

  4. Android进程保活

    Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...

  5. 关于 Android 进程保活,你所需要知道的一切

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...

  6. linux 定时任务 cron,利用cron进程保活

    cron定时任务 crond服务操作命令 /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service ...

  7. 【腾讯Bugly干货分享】Android进程保活招式大全

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:腾讯——张兴华 目前市面上 ...

  8. Android 进程保活招式大全

    目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被 ...

  9. Android 进程常驻、进程守护、进程保活技术的总结

    转载自:http://blog.csdn.net/marswin89/article/details/50917098 这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就 ...

随机推荐

  1. requests+正则表达式 爬取 妹子图

    做了一个爬取妹子图某张索引页面的爬虫,主要用request和正则表达式. 感谢 崔庆才大神的 爬虫教学视频 和 gitbook: B站:https://www.bilibili.com/video/a ...

  2. 如何让两个div并排显示

    正常情况下两个div都是上下排版的,那么怎么让它们并排显示呢? 方法一:都左浮动float:left; 方法二:一个左浮动,一个右浮动 方法三:给两个div都设置display:inline属性,但两 ...

  3. 【转载】Redis Sentinel服务配置

    转载地址:http://blog.csdn.net/vtopqx/article/details/49247285 redis官网文档:http://www.redis.cn/topics/senti ...

  4. javascript总结35:DOM之给a注册点击事件, 阻止a标签的默认行为

    给a注册点击事件时,有默认行为,阻止默认行为的方式: retrun false <!DOCTYPE html> <html lang="zh-CN"> &l ...

  5. 读取txt文件,并用其他格式显示

    这篇博客参照http://www.cnblogs.com/insus/archive/2013/08/08/3247078.html 题目是这样的: 一个txt文件,内容格式: 39.4% 2013- ...

  6. KindEditor3.x整合教程-Xproer.WordPaster

    版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...

  7. MVC模式在Java Web应用程序中的实例分析

    MVC在软件架构中是一种比较重要的架构思想,已经被广泛的应用在实际的java web项目开发中,我们所要了解和掌握的是mvc的架构思想和使用mvc模式来分析和解决问题的方法.当然相同或不同的项目都有各 ...

  8. 记一次阿里云linux病毒清理过程

    1.起因   因为这台服务器是我们公司内部开发服务器,几乎每个人都有root密码.在两天前突然有同事反馈说偶尔会有ssh连不上,git代码无法提交的问题,刚开始也没有在意,以为是阿里云服务器网络波动的 ...

  9. Android-自定义RadioButton

    1.控件RadioButton需要用RadioGroup包裹起来,才能使用2.RadioButton必须设置ID才能实现单选功能3.RadioGroup有方向(垂直方向 和 水平方向)默认是垂直方向 ...

  10. Verilog MIPS32 CPU(六)-- MDU

    Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...