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)冲突.如:

1       JobInfo.Builder builder = new JobInfo.Builder(JobIds.PHOTOS_CONTENT_JOB,
2                 new ComponentName("com.example.android.apis", PhotosContentJob.class.getName()));
3         // Look for specific changes to images in the provider.
4         builder.addTriggerContentUri(new JobInfo.TriggerContentUri(
5                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
6                 JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
7         // Also look for general reports of changes in the overall provider.
8         builder.addTriggerContentUri(new JobInfo.TriggerContentUri(MEDIA_URI, 0));
9         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

转载于:https://www.cnblogs.com/sjjg/p/9664785.html

JobScheduler布置后台任务以及实现进程保活?相关推荐

  1. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  2. Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  3. Android 进程保活手段分析

    如何进行进程保活,首先我们应该先分析一下进程被杀死的原因开始 Android进程被杀死的场景分析: 从 Android 的进程被杀死的场景分析,查看被杀死的原因 一.Android手机的进程回收策略 ...

  4. Android安卓进程保活(二)

    Android进程保活·设置前台Service,提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/proces ...

  5. Android 系统(274)---Anroid5.0以上进程保活方案(亲测可自行调起被杀死的app)

    Anroid5.0以上进程保活方案(亲测可自行调起被杀死的app) 实验了几种最后选择了2中组合 第一种 开启一像素activity保活,如果2个activity同时被杀死则此方案不可选. 第二种 发 ...

  6. Android 系统(146)----Android进程保活招数概览

    Android进程保活招数概览 Android中的进程保活应该分为两个方面: 提高进程的优先级,减少被系统杀死的可能性 在进程已经被杀死的情况下,通过一些手段来重新启动应用进程 本文针对这两方面来进程 ...

  7. Android进程保活、拉活方案

    引言 最近产品提出了一个非常BT的需求,说我们所做的APP要做到像微信和QQ那种即时用户清理了进程还是能收到消息的效果,当时心中就卧槽了一顿,虽然心里一万只曹尼玛翻滚着,但是功能还是要做啊,因为生活还 ...

  8. Android7.0 8.0进程保活与拉活的实现方式

    进程保活 前言 APP进程被系统杀死 Low Memory Killer 进程优先级 进程保活 1px Activity 前台Service 进程拉活 粘性Service JobScheduler 双 ...

  9. 解密Android7.0 8.0进程保活与拉活的实现方式 如何才能让APP常驻内存 躲避系统的追杀

    进程保活 前言 APP进程被系统杀死 Low Memory Killer 进程优先级 进程保活 1px Activity 前台Service 进程拉活 粘性Service JobScheduler 双 ...

  10. Android进程保活的一般套路

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

最新文章

  1. 《敏捷制造——敏捷集成基础结构设计》——1.2相关问题的国内外研究现状
  2. 读《UNIX编程艺术》随记
  3. 【整理】使用云计算服务面临的几个安全问题
  4. 探索java世界中的日志奥秘
  5. 震撼!豆瓣评分9.3,这部纪录片带你感受生命之重!
  6. CodeForces 592C The Big Race
  7. iPhone 12发布前夜:富士康奖励万元招不到人,有工人国庆连轴转
  8. NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 标签格式及标准
  9. 三对角、五对角追赶法求解线性方程组
  10. 前端之ps的基本操作
  11. Gitee更新代码提示:master has no tracked branch
  12. 纸张的规格A3.A4.A5.A6纸的尺寸大小
  13. Java——线程回顾汇总:同步/生产者消费者模式/定时调度
  14. LWIP网络开发从入门到精通
  15. python实现关键词搜索
  16. 用plt.scatter画散点图
  17. Scaner VS bufferedReader
  18. 高新技术企业补贴如何申请?
  19. EL表达式处理字符串
  20. 瑞吉外卖-Day01

热门文章

  1. 宝利通视频会议常见故障
  2. easyExcel去除网格线【完美解决】
  3. 通过motion实现摄像头远程监控(转)
  4. python远程调用摄像头_Python调用摄像头
  5. excepted one 0f #, =>at line16,column 16(byte 311)
  6. mongodb WT_ERROR: non-specific WiredTiger error
  7. 淘思精灵-网赚菜鸟的福音
  8. as常用固定搭配_语法必看:as的几种固定用法
  9. Typora任意更改样式
  10. mac上 网易mumu模拟器在打开代理后无法使用键盘 解决办法