Android任务调度JobScheduler,JobService
首先定义一个JobService:
import android.app.job.JobParameters;
import android.app.job.JobService;
import java.util.concurrent.TimeUnit;
/**
* 注意:JobService运行在主线程,需要开启新线程处理耗时工作。
*
* 当系统把JobService所在App杀掉后,仍会在之前JobInfo设定的周期和延迟时间执行。
* Android系统仍会根据jobId执行之前未完成的Job。
*/
public class MyJobService extends JobService {
private JobParameters parameters;
private int progress = -1;
/**
* 如果返回值是false,系统认为这个方法返回时任务已经执行完毕。
* 如果返回值是true,系统认为这个任务要被执行。
*
* @param params
* @return
*/
@Override
public boolean onStartJob(JobParameters params) {
this.parameters = params;
// 开启新线程处理耗时工作。
startMyLongTimeWork();
// 当返回true时,系统会认为我们执行一个耗时任务。
// onStartJob方法返回时,开发者运行的线程任务仍在异步执行。
// 当开发者的任务执行完成时,必须手动调用jobFinished(JobParameters params, boolean needRescheduled)通知系统。
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
System.out.println("onStopJob");
return false;
}
/**
* 模拟一个耗时的后台线程任务。
*/
private void startMyLongTimeWork() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(parameters.getJobId() + " 后台线程任务:" + progress);
progress++;
} catch (InterruptedException e) {
e.printStackTrace();
}
if (progress > 100) {
break;
}
}
jobFinished(parameters, false);
}
}).start();
}
}
写入到Androidmanifest.xml文件:
android:name=".MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
使用:
private void test() {
JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
//关键。
int jobId = (int) (Math.random()*1000);
ComponentName componentName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(jobId, componentName)
.setMinimumLatency(3000)//最小延时3秒。
.setOverrideDeadline(5000)//超过10秒后无论如何也要执行。
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NOT_ROAMING)//非移动网络。
//.setPeriodic (long intervalMillis)//执行周期,每隔一段时间间隔执行一次。
//.setPersisted(boolean isPersisted);//设置设备重启后,任务是否保留。需要权限:RECEIVE_BOOT_COMPLETED
//.setRequiresCharging(boolean )//是否需要充电。
//.setRequiresDeviceIdle(boolean)//是否需要等设备空闲状态时候运行。
//.addTriggerContentUri(uri)//监听uri数据发生改变,触发任务执行。
//.setTriggerContentMaxDelay(long duration)//设置Content发生变化一直到任务被执行最大延迟时间。
//.setTriggerContentUpdateDelay(long durationMilimms)//设置Content发生变化一直到任务被执行中间的延迟。如果在这个延迟时间内content发生了改变,延迟时间会重写计算。
.build();
//开始运行job。
mJobScheduler.schedule(jobInfo);
}