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上实现进程常驻,也就 ...
随机推荐
- Sublime Text 2 安装配置插件
最近学习python,看网上推荐用sublime text2挺方便,就学习了一下对sublime text2 安装插件,先放在这里,以备以后查找 根据晚上资料修改,原文请看这里 Python的自动补全 ...
- 4.3.3 thread对性能有何帮助
public class ThreadLocalDemo { public static final int GE_COUNT = 10000000; public static final int ...
- libxml2
http://www.xmlsoft.org/downloads.html 建议直接用openscenegraph下载的3rdparty:http://www.openscenegraph.org ...
- Integer和String "+""=="方法的不同
在上面的两个篇博客中,我们看到String和Integer不同的常量池的变现形式 我们再看一个例子: public static void main(String[] args) { // TODO ...
- jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名
第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...
- memcached整理の编译
memcached是一个自由&开放源码, 高性能,分布式的内存对象缓存系统. nosql相对于传统关系型数据库的"行与列",NoSQL 的鲜明特点为k-v 存储(memca ...
- CSS选择器与jQuery选择器的异同:一些特殊的选择器
在CSS3选择器标淮草案定义的选择器语法中,jQuery支持相当完整的一套子集,同时还添加了一些非标准但很有用的伪类.下面是一些jQuery扩展的选择器:(来自http://www.cnblogs.c ...
- WinAPI 字符及字符串函数(10): lstrcpy - 复制字符串
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- jquery-tmpl 插件
做项目时页面上有处功能是:在页面有处列表.有添加,我添加修改或删除后要刷新这个列表,首先想到的是局部刷新,但我们一般说的局部刷新就是利于ajax去后台调用数据并显示,而这里是一整个列表就比较麻烦了,刷 ...
- Mvc 项目中使用Bootstrap以及基于bootstrap的 Bootgrid
官方地址参考http://www.jquery-bootgrid.com/Examples Bootgrid 是一款基于BootStrap 开发的带有查询,分页功能的列表显示组件.可以在像MVC中开发 ...