美文网首页
Android 5.0+ JobService 的使用

Android 5.0+ JobService 的使用

作者: kedwan | 来源:发表于2018-09-01 15:47 被阅读282次

    1、新建一个Service继承 JobService

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public class MyJobService extends JobService {
    
        private int mJobId = 0x00200;
        private final long requestInterval = 5*60*1000;//间隔多久调用一次
        private Context mContext;
        @Override
        public void onCreate() {
            super.onCreate();
            this.mContext = this;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            scheduleJob(getJobInfo());
            return START_NOT_STICKY;
        }
    
        @Override
        public boolean onStartJob(JobParameters jobParameters) {
            KLog.a("JobService onStartJob");
            new MonitorAsyncTask().execute(jobParameters);
            return true;
        }
    
        @Override
        public boolean onStopJob(JobParameters jobParameters) {
            KLog.a("JobService onStopJob");
            scheduleJob(getJobInfo());
            return false;
        }
    
        //将任务作业发送到作业调度中去
        public void scheduleJob(JobInfo t) {
            JobScheduler tm = null;
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                tm = getSystemService(JobScheduler.class);
            }else{
                tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
            }
            if(tm != null) {
                tm.cancel(mJobId);
                tm.schedule(t);
            }
        }
    
    
        public JobInfo getJobInfo(){
    
            //代表一个任务 使用建造者模式建造
            JobInfo jobInfo;
            // Android7上,设置周期执行时间,会强制按照getMinPeriodMills阈值执行,此时设置任务执行最小时间间隔解决该问题
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                jobInfo = new JobInfo.Builder(mJobId, new ComponentName(this, MyJobService.class))
                        .setBackoffCriteria(requestInterval,JobInfo.BACKOFF_POLICY_LINEAR)
                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                        .setMinimumLatency(requestInterval)
                        .setOverrideDeadline(requestInterval)
                        .setPersisted(true)
                        .build();
            }else{
                jobInfo = new JobInfo.Builder(mJobId, new ComponentName(this, MyJobService.class))
                        .setBackoffCriteria(requestInterval, JobInfo.BACKOFF_POLICY_LINEAR)//设置线性重试策略
                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) //设置网络类型
                        .setPeriodic(requestInterval) //设置执行周期
                        .setPersisted(true)//设置重启后任务是否保留
                        .build();
            }
            return jobInfo;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Intent intent = new Intent();
            intent.setClass(this,MyJobService.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startService(intent);
        }
    
        //AsyncTask处理耗时操作
        private class MonitorAsyncTask extends AsyncTask<JobParameters,Void,String> {
            private JobParameters mJobParameters;
            /**
             *
             * @param jobParameters The parameters of the task.
             * @return A result, defined by the subclass of this task.
             * @see #onPreExecute()
             * @see #onPostExecute
             * @see #publishProgress
             */
            @Override
            protected String doInBackground(JobParameters... jobParameters) {
                mJobParameters = jobParameters[0];
                ..... 耗时操作
                return null;
            }
            //完成之后的处理工作
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                    //如果不调用此方法,任务只会执行一次
                    jobFinished(mJobParameters,true);
                }else{
                    //如果不调用此方法,任务只会执行一次
                    jobFinished(mJobParameters,false);
                }
    
            }
        }
    
    }
    

    2、在AndroidManifest中注册service

    <application>
          ......
          <service
                android:name=".service.MyJobService"
                android:permission="android.permission.BIND_JOB_SERVICE"
                android:enabled="true"
                android:exported="true" />
    </application>
    

    3、调用的时候正常启动Service就可以了

    相关文章

      网友评论

          本文标题:Android 5.0+ JobService 的使用

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