JobScheduler布置后台任务以及实现进程保活?
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.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,这是一个非常严厉的约束,如果网络类型不满足, 任务不会被执行.这个方法有重载,只调用其中一个就可,重复调用后面的会覆盖前面的. 常用的类型:
|
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布置后台任务以及实现进程保活?的更多相关文章
- 转: android app进程保活的文章列表
1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...
- Android--使用JobService实现进程保活
进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径. 先来看看android中有几种进程 ...
- JobService和JobScheduler机制在Android5.0以上保活
JobService和JobScheduler机制在Android5.0以上保活 我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致非常多不光明的手段来进行++保活++.但 ...
- Android进程保活
Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...
- 关于 Android 进程保活,你所需要知道的一切
早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...
- linux 定时任务 cron,利用cron进程保活
cron定时任务 crond服务操作命令 /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service ...
- 【腾讯Bugly干货分享】Android进程保活招式大全
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:腾讯——张兴华 目前市面上 ...
- Android 进程保活招式大全
目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被 ...
- Android 进程常驻、进程守护、进程保活技术的总结
转载自:http://blog.csdn.net/marswin89/article/details/50917098 这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就 ...
随机推荐
- requests+正则表达式 爬取 妹子图
做了一个爬取妹子图某张索引页面的爬虫,主要用request和正则表达式. 感谢 崔庆才大神的 爬虫教学视频 和 gitbook: B站:https://www.bilibili.com/video/a ...
- 如何让两个div并排显示
正常情况下两个div都是上下排版的,那么怎么让它们并排显示呢? 方法一:都左浮动float:left; 方法二:一个左浮动,一个右浮动 方法三:给两个div都设置display:inline属性,但两 ...
- 【转载】Redis Sentinel服务配置
转载地址:http://blog.csdn.net/vtopqx/article/details/49247285 redis官网文档:http://www.redis.cn/topics/senti ...
- javascript总结35:DOM之给a注册点击事件, 阻止a标签的默认行为
给a注册点击事件时,有默认行为,阻止默认行为的方式: retrun false <!DOCTYPE html> <html lang="zh-CN"> &l ...
- 读取txt文件,并用其他格式显示
这篇博客参照http://www.cnblogs.com/insus/archive/2013/08/08/3247078.html 题目是这样的: 一个txt文件,内容格式: 39.4% 2013- ...
- KindEditor3.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- MVC模式在Java Web应用程序中的实例分析
MVC在软件架构中是一种比较重要的架构思想,已经被广泛的应用在实际的java web项目开发中,我们所要了解和掌握的是mvc的架构思想和使用mvc模式来分析和解决问题的方法.当然相同或不同的项目都有各 ...
- 记一次阿里云linux病毒清理过程
1.起因 因为这台服务器是我们公司内部开发服务器,几乎每个人都有root密码.在两天前突然有同事反馈说偶尔会有ssh连不上,git代码无法提交的问题,刚开始也没有在意,以为是阿里云服务器网络波动的 ...
- Android-自定义RadioButton
1.控件RadioButton需要用RadioGroup包裹起来,才能使用2.RadioButton必须设置ID才能实现单选功能3.RadioGroup有方向(垂直方向 和 水平方向)默认是垂直方向 ...
- Verilog MIPS32 CPU(六)-- MDU
Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...