Android中JobScheduler和JobService的简单使用示例

来源:互联网 发布:国盛证券交易软件 编辑:程序博客网 时间:2024/05/29 14:36

JobScheduler可以安排一个周期性的任务,同时与AlarmManager相比,
它可以提前设定任务的执行条件。

具体的使用方法,类似于如下代码:

..............//得到JobScheduler对象JobScheduler scheduler = (JobScheduler) getActivity()        .getSystemService(Context.JOB_SCHEDULER_SERVICE);//判断是否已经安排过任务if (isJobPollServiceOn()) {    //每个具体的任务,都对应一个ID,这里是取消任务的接口    scheduler.cancel(JOB_ID);} else {    //此处定义具体的任务    JobInfo jobInfo = new JobInfo.Builder(            //指定任务ID和任务对应的JobService,实际的任务将有JobService的子类来完成            JOB_ID, new ComponentName(getContext(), JobPollService.class))            //设定任务的启动条件            //还有其它接口,例如setRequiresCharging等            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)            //设置任务的周期            .setPeriodic(1000 * 10 * 15)            //设置任务常驻,即开机启动,要求RECEIVE_BOOT_COMPLETED权限            .setPersisted(true)            .build();    //安排任务    scheduler.schedule(jobInfo);}..............

上述代码中,判断一个任务是否已经安排过的代码如下:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)private boolean isJobPollServiceOn() {    JobScheduler scheduler = (JobScheduler) getActivity()            .getSystemService(Context.JOB_SCHEDULER_SERVICE);    boolean hasBeenScheduled = false;    //getAllPendingJobs得到是当前Package对应的已经安排的任务    for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {        if (jobInfo.getId() == JOB_ID) {            hasBeenScheduled = true;            break;        }    }    return hasBeenScheduled;}

从前面的代码,我们知道任务的实际执行者是JobService的子类,
其示例代码如下,主要重写onStartJob、onStopJob等接口:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public class JobPollService extends JobService {    ............    @Override    public boolean onStartJob(JobParameters params) {        //执行实际的工作        //onStartJob在主线程中调用,因此耗时工作需要利用独立线程来完成        .............        //任务完成后,调用jobFinished接口        //第二个参数的描述是:needsReschedule        //当为true时,表示当前任务需要下次重新安排        jobFinished(params, false);        return true;    }    //当JobService结束时,将回调该接口    //return true表示任务下次继续;return false表示不需要继续    @Override    public boolean onStopJob(JobParameters params) {        ...............        return true;    }}

定义了JobService的子类后,需要在AndroidManifest.xml中进行声明:

...........<service android:name=".service.JobPollService"        //声明权限,使得仅有JobScheduler可以调用该服务        android:permission="android.permission.BIND_JOB_SERVICE"        android:exported="true"/>............

本篇博客暂时只记录JobScheduler相关的基本用法,后续再进行补充。

0 0
原创粉丝点击