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. Sublime Text 2 安装配置插件

    最近学习python,看网上推荐用sublime text2挺方便,就学习了一下对sublime text2 安装插件,先放在这里,以备以后查找 根据晚上资料修改,原文请看这里 Python的自动补全 ...

  2. 4.3.3 thread对性能有何帮助

    public class ThreadLocalDemo { public static final int GE_COUNT = 10000000; public static final int ...

  3. libxml2

    http://www.xmlsoft.org/downloads.html   建议直接用openscenegraph下载的3rdparty:http://www.openscenegraph.org ...

  4. Integer和String "+""=="方法的不同

    在上面的两个篇博客中,我们看到String和Integer不同的常量池的变现形式 我们再看一个例子: public static void main(String[] args) { // TODO ...

  5. jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名

    第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...

  6. memcached整理の编译

    memcached是一个自由&开放源码, 高性能,分布式的内存对象缓存系统. nosql相对于传统关系型数据库的"行与列",NoSQL 的鲜明特点为k-v 存储(memca ...

  7. CSS选择器与jQuery选择器的异同:一些特殊的选择器

    在CSS3选择器标淮草案定义的选择器语法中,jQuery支持相当完整的一套子集,同时还添加了一些非标准但很有用的伪类.下面是一些jQuery扩展的选择器:(来自http://www.cnblogs.c ...

  8. WinAPI 字符及字符串函数(10): lstrcpy - 复制字符串

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  9. jquery-tmpl 插件

    做项目时页面上有处功能是:在页面有处列表.有添加,我添加修改或删除后要刷新这个列表,首先想到的是局部刷新,但我们一般说的局部刷新就是利于ajax去后台调用数据并显示,而这里是一整个列表就比较麻烦了,刷 ...

  10. Mvc 项目中使用Bootstrap以及基于bootstrap的 Bootgrid

    官方地址参考http://www.jquery-bootgrid.com/Examples Bootgrid 是一款基于BootStrap 开发的带有查询,分页功能的列表显示组件.可以在像MVC中开发 ...