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上实现进程常驻,也就 ...
随机推荐
- RobotFramework学习-问题
RobotFramework,基于Python的自动化测试框架.近期学习中遇到过一些问题. 1.运行ride时,报错[ ERROR ] option --monitorcolors not recog ...
- 黑盒测试实践-任务进度-Day04
任务进度11-29 使用工具 selenium 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了前两天的学习任务的安排,以下是大家的任务进度: 华同学(任务1) 1.和其他小 ...
- smarty内置函数、自定义函数
1.把字符串里的d字母替换成h格式:{'d'|str_replace:'h':$str}; d要查找的字符 h要替换的字符 $str字符串 2.function test($param){$p1=$p ...
- python列表技巧
1.访问列表元素 test1 = ["chengqian","and","what"] print(test1[0])#第一个元素 prin ...
- 在win10 + ie11上使用控件
1.1. 在Win10+IE11上提示创建文件错误的问题 解决方法: 1.打开Internet选项 2.取消勾选启用保护模式 选择"不再显示此消息"
- 【Linux】Linux各文件夹说明
转载 /bin/ — 用来贮存普通命令. /sbin/ — 许多系统命令(例如 shutdown)的贮存位置.属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统./sbin目 ...
- MongoDB整理笔记のjava MongoDB分页优化
最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...
- C#基础入门 三
C#基础入门 三 类 类使用class关键字进行声明,前面加一个访问修饰符,public class car{} 访问修饰符:修师傅可以用来修饰类和类成员等,控制它们的可见度 修饰符关键字分别为:pu ...
- android hook getdeceiveid
很多手机软件使用了手机绑定.QQ,微信等.如果使用了不同的设备,则需要验证码. 要用一台手机来模拟与另一台手机一样环境,估计hook 系统的相关函数可以实现. 想着应该有现成的软件的,例如 smart ...
- python学习之路 六 :装饰器
本节重点: 掌握装饰器相关知识 python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函 ...