使用AlarmManager、IntentService和PendingIntent相互配合,创走周期性的后台任务,实现一个完全可用的后台服务还需要手动执行以下操作。

  计划一个周期性任务

  检查周期性任务的运行状态

  检查网络是否可用

在实际场景下,还有更多想法需要实现,例如请求失败,是否还需要稍后重试机制。或者是只允许应用使用不限量的网络连接...

在系统控制方面,本章实现的后台服务也存在一些问题,它无法在某种情况停下来,除非手动停止。

JobScheduler:除了实现常规后台任务之外,JobScheduler还支持按场景、按条件运行后台服务。

JobScheduler的使用:

创建一个类继承JobService,并覆盖onStartJob(JobParameters parms)方法和onStopJob(JobParameters params)。

public class PollService extends JobService {

    @Override
public boolean onStartJob(JobParameters params) {
return false;
} @Override
public boolean onStopJob(JobParameters params) {
return false;
}
}

Android准备好执行任务时,服务就会启动,此时会在主线程上收到onStartJob()方法调用。该方法返回false结果表示:"交代的任务我已全力去做,现在做完了。”返回 true 结果则表示:“任务收到,正在做,但是还没有做完。”

JobService在执行的时候需要单开线程,可以使用AsyncTask按如下方式创建新线程。

    private PollTask mCurrentTask;

@Override
public boolean onStartJob(JobParameters parms){
mCurrentTask = new PollTask();
mCurrentTask.execute(parms);
return true;
} private class PollTask extends AsyncTask<JobParameters,Void,Void> {
@Override
protected Void doInBackground(JobParameters... params) {
JobParameters jobParams = params[0];
//执行任务的逻辑
jobFinished(jobParams, false);
return null;
}
}

任务执行完毕后,就可以调用jobFinished(JobParameters, boolean)方法通知结果,如果该方法的第二个参数传入true的话,就等于说:“事情这次做不完了,请计划在下次某个时间继续吧。”

onStopJob(JobParameters)方法适合在中断任务时调用,用户通常需要服务在有WIFI连接时才运行,如果在调用JobFinished()之前(任务完成之前),手机就没了Wifi,onStopJob(...) 方法就会被调用,也就是说,一切任务就立即停止了。

@Override
public boolean onStopJob(JobParameters params) {
if (mCurrentTask != null) {
mCurrentTask.cancel(true);
}
return true;
}

调用 onStopJob(...) 方法就是表明,服务马上就要停掉了。不要抱有幻想,请立即停止手头上的一切事情。这里,返回 true 表示:“任务应该计划在下次继续。”返回 false 表示:“不管怎样,事情就到此结束吧,不要计划下次了。”

使用JobService,必须在Manifest配置清单中添加权限:

<service
android:name=".PollService"
android:permission="android.permission.BIND_JOB_SERVICE" //添加的权限控制只有JobScheduler才能运行它。
android:exported="true"/>

通过JobScheduler检查是否已计划好了任务:

final int JOB_ID = 1;
JobScheduler scheduler = (JobScheduler)
context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
boolean hasBeenScheduled = false;
for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {
if (jobInfo.getId() == JOB_ID) {
hasBeenScheduled = true;
}
}

PoolService的运行:

final int JOB_ID = 1;

JobScheduler scheduler = (JobScheduler)
context.getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(context, PollService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPeriodic(1000 * 60 * 15)
.setPersisted(true)
.build();
scheduler.schedule(jobInfo);

上述代码计划任务每15分钟运行一次,但前提条件是有Wi-Fi或有可用的不限流量网络。调用 setPersisted(true) 方法可保证服务在设备重启后也能按计划运行。

JobScheduler 和 JobService的更多相关文章

  1. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  2. 快速开发android,离不开这10个优秀的开源项目

    作为一名菜鸡Android,时常瞻仰大佬们的开源项目是非常必要的.这里我为大家收集整理了10个优秀的开源项目,方便我们日常开发中学习! 作者:ListenToCode博客:https://www.ji ...

  3. 个人收集的Android开源项目

    1. KnowWeather 下载:GitHub 一款 Android 开源天气 App ,包含天气信息.详情.生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级.区级城市的 ...

  4. Android5.0和Android6.0适配

    gradle配置项 compileSdkVersion 用哪个 Android SDK 版本编译你的应用.因此我们强烈推荐总是使用最新的 SDK 进行编译.在现有代码上使用新的编译检查可以获得很多好处 ...

  5. JobService和JobScheduler机制在Android5.0以上保活

    JobService和JobScheduler机制在Android5.0以上保活 我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致非常多不光明的手段来进行++保活++.但 ...

  6. JobScheduler

    任务写在JobService中 public class TestJobService extends JobService { private static final String TAG = & ...

  7. 安卓电量优化之JobScheduler使用介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.JobScheduler概述 JobScheduler是安卓5.0版本推出的API,允许开发者在符合某些条件时创建执行在后台的任务.在Andro ...

  8. Android--使用JobService实现进程保活

    进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径. 先来看看android中有几种进程 ...

  9. 在Android 5.0中使用JobScheduler(转载)

    翻译见:http://blog.csdn.net/bboyfeiyu/article/details/44809395 In this tutorial, you will learn how to ...

随机推荐

  1. Codeforces 1292B/1293D - Aroma's Search

    题目大意: Aroma想要找数据第0个数据再x0,y0这个点其后所有数据所在的坐标点满足x[i]=x[i-1]*ax+bxy[i]=y[i-1]*ay+byAroma一开始在点(xs,ys),她最多只 ...

  2. nodepad++ 让所有的加号收缩折叠展开的快捷键

    折叠所有层次 Alt+0(这是零) 展开所有层次 Alt+Shift+0

  3. Matlab高级教程_第三篇:Matlab转码C/C++方式(混编)_第一部分

    0. 其实Matlab的转码混编大多数就是为了现成的算法函数不用再写了,2就是为了方便提高代码运行速度用C语言去运行. 1. MEX文件: Mex文件是一种可在matlab环境中嗲用C语言(或fort ...

  4. [USACO09DEC]视频游戏的麻烦Video Game Troubles(DP)

    https://www.luogu.org/problem/P2967 https://ac.nowcoder.com/acm/contest/1077/B 题目描述 Farmer John's co ...

  5. mybatis分页插件PageHelper简单应用

    --添加依赖 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --><depende ...

  6. PHP小点注意

    (1)控制器不可以有list,因为它属于thinkPHP的保留关键字,不可以重名

  7. 金山wps的面试经历

    故事从两个月前开始说起吧. 前段时间突然想跳槽,原因也没啥,就是想折腾下,看看外面的世界?有一部分原因是想离家近一些稳定下来,博主上份工作坐标厦门,风景好的简直随便拍照就是大片. 不废话了,机缘巧合, ...

  8. 关于vyos 防火墙配置

    VyOS是一个基于Debian的网络操作系统,是Vyatta的社区fork.Vyatta是博通的企业级的产品,通过这套系统,能在x86平台提供路由,防火墙和×××的功能. 这个系统提供了和其他诸如Ci ...

  9. P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles

    冲刺阶段的首篇题解! 题目链接:P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles: 题目概述: 总共N个游戏平台,金额上限V元,给出每个游戏平台的价钱和其上游戏 ...

  10. 1)session总结

    (1)session的由来: HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众 ...