2020-04-28-Android-JobScheduler

应用层

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容