JobScheduler 和 JobService

使用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) 方法可保证服务在设备重启后也能按计划运行。

时间: 2024-11-07 04:57:35

JobScheduler 和 JobService的相关文章

安卓权威编程指南-笔记(第26章 服务的作用)

1. IntentService IntentService也是一个context(Service是Context的子类),并能够响应intent. 一个最基本的IntentService实例如下: public class PollService extends IntentService { private static final String TAG = "PollService"; public static Intent newIntent(Context context)

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

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 JobScheduler 来运行.在 PollService 启动代码中,检查系统版本是否为Lollipop:如果是,就 使用 JobScheduler 计划运行 JobService :如果不是,依然使用 AlarmManager 实现. JobService类: 1 package com.bign

Android JobService的使用及源码分析

Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗.本文首先介绍JobSerice的使用方法,然后分析JobService的源码实现. JobService的使用 使用JobScheduler的时候需要把待执行的后台任务封装到JobService中提交.下面就来介绍JobService的使用,首先看一下JobService是什么东东. 从上面的截图,可以看出J

Android 5.0的调度作业JobScheduler

Android 5.0 提供了一个新的 JobScheduler API,它允许您通过为系统定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命. 首先看一下官方JobScheduler的API  https://developer.android.com/reference/android/app/job/JobScheduler.html This is an API for scheduling various types of jobs agains

在Android 5.0中使用JobScheduler

在Android 5.0中使用JobScheduler 原文链接 : using-the-jobscheduler-api-on-android-lollipop 译者 : Mr.Simple 校对者 : Mr.Simple 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API.JobScheduler API允许开发者在符合某些条件时创建执行在后台的任务. 介绍 在Android开发中,会存在这么些场景 : 你需要在稍后的某个时间点或者当满足某个特定的条件

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

一.JobScheduler概述 JobScheduler是安卓5.0版本推出的API,允许开发者在符合某些条件时创建执行在后台的任务.在Android开发中,会存在这些场景:你需要在稍后的某个时间点或者当满足某个特定的条件时执行一个任务,例如当设备接通电源适配器或者连接到WIFI,此时就可以使用JobScheduler了,当一系列预置的条件被满足时,JobScheduler API为你的应用执行一个操作.与AlarmManager不同的是这个执行时间是不确定的.除此之外,JobSchedule

【转】JobScheduler

JobScheduler JobScheduler是Android L(API21)新增的特性,用于定义满足某些条件下执行的任务.它的宗旨是把一些不是特别紧急的任务放到更合适的时机批量处理,这样可以有效的节省电量. 为什么需要JobScheduler Android在进入待机状态时,会不断关闭各种硬件来延长手机的待机时间,首先屏幕会逐渐变暗直至关闭,然后CPU进入睡眠,这一切操作都是为了节约宝贵的电量资源.但是即使在这种睡眠状态下,大多数应用还是会尝试进行工作,他们将不断的唤醒手机. 在Andr

使用JobScheduler

我们将部分任务交给系统决定,因为系统知道什么时间执行最省电,我们的任务是辨别哪些任务可以通过API交给Android任务调度器.JobScheduler传送门下面是一个示例,首先需要一个JobService public class MyJobService extends JobService { private static final String LOG_TAG = "MyJobService"; @Override public void onCreate() { super