应用层
应用层使用job,首先创建一个JobService,重写onStartJob和onStopJob方法,如果job需要执行一些比较耗时操作,则可以通过异步的方式实现,在onStartJob中返回true,表示这是一个耗时操作,会调用onStopJob方法。
public class JobScheduleService extends JobService {
private static final String TAG = "JobScheduleService";
private JobTask jobTask;
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "onStartJob");
jobTask = new JobTask();
jobTask.execute(jobParameters);
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.d(TAG, "onStopJob");
jobTask.cancel(true);
return false;
}
private class JobTask extends AsyncTask<JobParameters, Void, Integer> {
@Override
protected Integer doInBackground(JobParameters... jobParameters) {
try {
Thread.sleep(10 * 1000);
return 0;
} catch (InterruptedException e) {
StackTraceElement[] elements = e.getStackTrace();
for (int i = 0; i < (elements.length > 5 ? 5 : elements.length); i++) {
Log.d(TAG, "JobTask interrupted------" + elements[i]);
}
}
return -1;
}
}
}
同时需要在AndroidMainfest中声明,因为这是一个Service,属于四大组件之一,而且使用一个JobService需要声明BIND_JOB_SERVICE权限。
<service android:name="com.one.job.JobScheduleService"
android:permisson="android.permisson.BIND_JOB_SERVICE"/>
然后通过JobScheduler进行job任务的调度。
public class JobTest {
private static final String TAG = "JobScheduleService";
private static final int JOB_ID = 101;
private JobScheduler jobScheduleService;
private JobInfo.Builder jobBuilder;
public JobTest(Context context) {
jobScheduleService = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobBuilder = new JobInfo.Builder(JOB_ID, new ComponentName(context, JobScheduleService.class));
jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE);
jobBuilder.setRequiresCharging(true);
jobBuilder.setMinimumLatency(5000);
}
public void startJob() {
int code = jobScheduleService.schedule(jobBuilder.build());
Log.d(TAG, "startJob code=" + code);
}
public void stopJob() {
jobScheduleService.cancel(JOB_ID);
}
}
framework

参考
理解JobScheduler机制
JobService源码探究之 onStartJob()返回false立马被destroy
网友评论