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上实现进程常驻,也就 ...
随机推荐
- Go 网络编程笔记
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- Ubuntu14.04-LTS 从系统安装到配置可用
1.安装Ubuntu14.04LTS-64bit 使用U盘安装很方便快捷,可以使用老毛桃使用iso模式制作一个U盘启动盘,然后分区安装. 如果使用硬盘安装的话需要注意的问题是: 如果电脑上以前有Lin ...
- mac安装mysql及终端操作mysql与pycharm的数据库可视化
一.Mac安装mysql 首先下载mysql,地址:https://dev.mysql.com/downloads/mysql/ 然后已知安装就好了,会出现让你记住密码的提示,然后就安装好了.... ...
- 4.4.6 数组也能无锁:AtomicIntegerArray
数组也可以实现cas操作,有以下几个类以及用法如下: public class AtomicTntegerArrayTest { public static void main(String[] ar ...
- Windows 配置 nginx php 多版本切换
1. 下载 nginx nginx.org 2. 下载 php windows.php.net 选择 nts 版本,解压后,将php.ini.development 重命名为 php.in ...
- 使用shell脚本build并创建ipa文件(转)
前言 由于项目引入了敏捷开发,需要每天build出一个ipa供QA测试.此前是使用Xcode先achive出一个文件,再在 organizer->achives里发布ipa,一直感觉也没啥不方便 ...
- Web应用与Spring MVC锁session
http是无连接的,所以服务器上并不会为每个用户开辟一个线程,因为没有用户这个说法,但是服务器端是有session的,为了防止一个用户同时有多个请求在处理,spring mvc在处理请求时把sessi ...
- Mathcad操作tips:算式输入、变量定义与计算
算式输入 1. 数字与符号相乘,输入时不必手动输入乘号(“*”). 2. 以下有助于算式的可视化:a. 使用Math工具栏输入,并合理使用tab键:b. 合理使用空格键. 3. 输入开根号时,可用快捷 ...
- Partition--分区切换
现有数据表[dbo].[staging_TB1_20131018-104722]和分区表[dbo].[TB1],需要将分区表和数据表中做数据交换 CREATE TABLE [dbo].[staging ...
- ParserError: Error tokenizing data. C error: Expected 2 fields in line 15, saw 4
pandas 读取泰坦尼克号数据,报错 %matplotlib inline import numpy as np import pandas as pd import re as re train ...