1.简介
1.1 JobScheduler 特性
1、支持在一个任务上组合多个条件;
2、内置条件:设备待机、设备充电和连接网络;
3、支持持续的job,这意味着设备重启后,之前被中断的job可以继续执行;
4、支持设置job的最后执行期限
5、根据你的配置,可以设置job在后台运行还是在主线程中运行
适配:android 5.0。适用:后台数据上送,推送应用,想在将来的某个时间或在一定条件下运行任务,如上传图片、下载歌曲等操作想在接入电源或连接到wifi时执行等。
1.2 JobScheduler 优点
1、 JobScheduler的省电功能,由于JobScheduler是操作系统层面的,因此系统会更有效地执行所有调度工作,每小时设备的唤醒次数会显著减少,使系统更好地协调设备唤醒任务,会达到一定的省电效果
2、JobScheduler拥有更多的触发选项,包括充电状态、电量过低、Wifi状态、设备空闲以及延长失败链接后重连的间隔时间, 循环触发、系统重启后任务是否继续等,JobScheduler包下了这些状态的检测。
3、多任务调度
2.简单使用
2.1首先继承JobService,重写onStartJob 和 onStopJob方法
public class TestService extends JobService {
private static final String TAG = "TestService ";
/**
* false: 该系统假设任何任务运行不需要很长时间并且到方法返回时已经完成。
* true: 该系统假设任务是需要一些时间并且当任务完成时需要调用jobFinished()告知系统。
*/
@Override
public boolean onStartJob(JobParameters params) {
Log.i(TAG, "执行任务的id " + params.getJobId());
//主线程
Log.i(TAG,Thread.currentThread + "");
if (NetworkUtils.isNetworkConnected()) {
//执行任务调度
ToastUtils.show(UIUtils.getContext(),params.getJobId()+"开始执行");
return true;
} else {
Log.i(TAG, "无网络连接" + params.getJobId() + "不执行");
}
return false;
}
/**
* 当收到取消请求时,该方法是系统用来取消挂起的任务的。
* 如果onStartJob()返回false,则系统会假设没有当前运行的任务,故不会调用该方法。
*/
@Override
public boolean onStopJob(JobParameters params) {
Log.i(TAG, "任务" + params.getJobId()+"终止");
return false;
}
//JobScheduler的启动
public class MainActivity extends Activity {
private TextView result;
private Button btnStart;
private ComponentName jobService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
result = (TextView) findViewById(R.id.result_des);
btnStart = (Button) findViewById(R.id.start);
btnStart .setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pollServer();
}
});
}
private void pollServer() {
JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobService = new ComponentName(getPackageName(), MyJobService.class.getName());
JobInfo.Builder builder = new JobInfo.Builder(1, jobService); //1:jobid
builder.setMinimumLatency(5000)// 设置任务运行最少延迟时间
.setOverrideDeadline(60000)// 设置deadline,若到期还没有达到规定的条件则会开始执行
//NETWORK_TYPE_NONE 默认值。表示与网络状态无关
//NETWORK_TYPE_ANY 必须连接网络
//NETWORK_TYPE_NOT_ROAMING 必须连接非漫游的网络
//NETWORK_TYPE_UNMETERED 必须连接非计费的网络
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 设置网络条件,不是付费网络连接就触发
.setRequiresCharging(true)// 设置充电就会触发
.setRequiresDeviceIdle(true)// 设置手机空闲就会触发
.setPeriodic (1000*60*10);//每10分钟触发一次
if(mJobScheduler.schedule( builder.build() ) == JobScheduler.RESULT_SUCCESS){
//执行成功
ToastUtils.show(this,"任务执行成功");
} else if(mJobScheduler.schedule( builder.build() ) == JobScheduler.RESULT_FAILURE){
//执行成功
ToastUtils.show(this,"任务执行失败");
}
}
}
最后
你需要在 AndroidManifest.xml中增加服务节点,因此,你的应用程序有权限绑定和使用JobService类
<service android:name=".TestService"
android:permission="android.permission.BIND_JOB_SERVICE" />
网友评论