为了更好地实现后台服务,Android引入了一个叫JobScheduler的全新API。虽然很多时候能使用AlarmManager和IntentService实现后台服务,但是那绝对不容易。
1.工作原理
首先,创建一个处理任务的服务(使用JobService子类)。JobService有两个可覆盖的方法:onStartJob(JobParameters)和onStopJob(JobParameters)。
class PollService extends JobService {
@Override
public boolean onStartJob (JobParameters params) {
return false;
}
@Override
public boolean onStopJob (JobParameters params) {
return false;
}
}
Android准备好执行任务的时候,服务就会启动,此时会在主线程上收到onStartJob(...)方法调用。该方法返回false结果表示:“任务已经做完”。返回true结果则表示:“任务正在执行,还未做完”。
与IntentService不同,JobService需要单开新线程。可使用AsyncTask创建新线程。
class PollService extends JobService {
private PollTask mCurrentTask;
@Override
public boolean onStartJob (JobParameters params) {
mCurrentTask = new PollTask();
// 开启新线程去做
mCurrentTask.execute(params);
//但还没有做完
return true;
}
@Override
public boolean onStopJob (JobParameters params) {
if (mCurrentTask != null) {
mCurrentTask.cancel(true);
}
return false;
}
class PollTask extends AsyncTask<JobParameters, Void, Void> {
@Override
protected Void doInBackground(JobParameters...params) {
JobParameters jobParams = params[0];
....
//调用JobService.jobFinished(),通知任务是否做完。
jobFinished(jobParams, false);
return null;
}
}
}
任务完成后,就可以调用jobFinished(JobParameters, boolean)方法通知结果。当该方法的第二个参数传入true,就等于说:‘“任务这次做不完了,请计划在下次某个时间继续吧”。
任务运行时也可能会收到onStopJob(Parameters)调用,表明当前任务需要中断。调用onStopJob(...)方法就是表明,服务马上就要停掉了。返回true表示:“任务应该计划在下次继续”。返回false表示:“事情到此结束,不要计划下次了”。
2.添加权限
在manifest配置文件中登记服务时,必须导出它并为它添加权限:
<service
android:name=".PollService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true" />
所谓导出服务,就是把服务暴露出来,添加权限控制的只有JobScheduler才能运行它。
3.运行
可以创建一个JobInfo说明期望的任务运行时间。
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.shcedule(jobInfo);
上述代码计划任务每15分钟运行一次,但前提条件是有WiFi或有不限流量网络可用。调用setPersisted(true)方法可保证服务在设备重启后也能按计划运行。
4.检查计划
一旦创建了JobService,启动它就非常迅速了。可以使用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;
}
}
网友评论