什么是JobScheduler
老习惯,先附上API文档,API才是最权威的指导(不翻墙也可以正常访问)。
https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
官方demo git地址:
https://github.com/googlesamples/android-JobScheduler
一.简介
JobScheduler来自API level 21,是5.0新出的一种后台数据处理模式,
在Android 7.0的新特性中,Google对于新设备功耗要求越来越严格,对于APP的限制也越来越多。
详情可以看我的另外一篇翻译Android7.0新特性:
(简书)
http://www.jianshu.com/p/822699607bc2
(CSDN)
http://blog.csdn.net/aroundme/article/details/55002563
在第六点介绍使用Svelte项目优化后台的时候,提到了推荐使用JobScheduler来是吸纳调度作业,
并且希望将来所有应用都使用它来实现。
(然而对于国内市场情况来说并没有什么卵用)
二.应用场景
当你需要在Android设备满足某种场合才需要去执行处理数据,例如
* 应用具有您可以推迟的非面向用户的工作(定期数据库数据更新)
* 应用具有当插入设备时您希望优先执行的工作(充电时才希望执行的工作备份数据)
* 需要访问网络或 Wi-Fi 连接的任务(如向服务器拉取内置数据)
* 希望作为一个批次定期运行的许多任务
而使用JobScheduler可以很优雅的完成这些情况。
所以相比于其他方式,JobScheduler的好处是显而易见的。
* 避免频繁的唤醒硬件模块,造成不必要的电量消耗。
* 避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况下的)执行过多的任务消耗电量;
JobScheduler和Android 6.0出现的Doze都一样,总结来说就是限制应用频繁唤醒硬件,从而达到省电的效果。
然而心痛的是搜索引擎的结果:
作为一个开发者我也不想多说什么。
三.使用
大概介绍完之后,重点是如何使用JobScheduler来实现我们需要的功能。
1.创建JobService
首先需要自定义一个类来继承JobService,但是因为JobScheduler是要运行在API>21的情况下的,你需要设置点东西。
- 在build.gradle中设置minSdkVersion为21,但是这样太鸡肋了,难道还5.0以下都不匹配吗
- 使用注解不同版本采取不同策略,保证兼容。
重写onStartJob(JobParameters params) 和onStopJob(JobParameters params)方法。
public class JobSchedulerService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
2.Activity中配置JobInfo
JobInfo是控制任务执行的方式,包括时间,延时,状态选择等。
具体API:https://developer.android.google.cn/reference/android/app/job/JobInfo.html
如果不想看可以看Demo中我使用中文注释应该稍微好理解点。
3.开启MyJobService
在官方Demo中,在onStart()方法中开启了Intent注册了这个JobScheduler。
然后就可以愉快的调用API玩耍了。
推荐运行官方的Demo,简单易懂
具体运行推荐下载Github上的Demo运行,跑跑看一目了然。
如果偷偷懒可以看看下面的逻辑层代码,已经写上注释能够更好理解。
Activity代码
import android.app.Activity;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.PersistableBundle;
import android.support.annotation.ColorRes;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import com.example.android.jobscheduler.service.MyJobService;
import java.lang.ref.WeakReference;
import java.util.List;
/**
* Schedules and configures jobs to be executed by a {@link JobScheduler}.
* <p>
* {@link MyJobService} can send messages to this via a {@link Messenger}
* that is sent in the Intent that starts the Service.
*
*
* 计划和配置要由{@link JobScheduler}执行的作业。
*
* {@link MyJobService}可以通过{@link Messenger}向其发送消息
* 在启动服务的Intent中发送。
*/
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
//消息
public static