美文网首页
2020-04-28-Android-JobScheduler

2020-04-28-Android-JobScheduler

作者: 耿望 | 来源:发表于2020-05-07 12:34 被阅读0次

应用层

应用层使用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.jpg

参考

理解JobScheduler机制
JobService源码探究之 onStartJob()返回false立马被destroy

相关文章

网友评论

      本文标题:2020-04-28-Android-JobScheduler

      本文链接:https://www.haomeiwen.com/subject/dzcuwhtx.html