使用JobSchedule对任务进行合理排期

转载自: https://www.cnblogs.com/ouyanliu/p/7220279.html?utm_source=itdadao&utm_medium=referral

JobSchedule 是 Android 5.0之后添加进去的, 之前的版本没有.

JobSchedule 原理是一种将任务安排在恰当的实际进行操作一种方案机制. 具体提供了那些可选的时机, 如下:

  1. 在可用网络下执行. 在7.0 之前, 应用可以通过监听网络变化来执行任务, 当然了前提是应用必须存活. 7.0之后这类API已经失效, 而JobSchedule机制提供了网络变化的监听. 进一步可以在网络变化的情况下执行某些操作. 例如在wifi环境下执行下载任务等.
  2. 设备在充电或者空闲时执行一些任务.
  3. 设定执行的时间, 这个和上述两条条件一起使用.
具体的实现如下:

1 任务排期

//获取 JobScheduler 实例
final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
//或者
final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );

//构建JobInfo  jobId 为jobID. BusinessService 为Job接受的Service, 该Service必须继承JobService
final JobInfo.Builder builder = new JobInfo.Builder(jobId, new ComponentName(context,  BusinessService.class));

//设置设备重启是执行此任务. 前提是需要拥有RECEIVE_BOOT_COMPLETED  权限
builder.setPriority(JobInfo.PRIORITY_FOREGROUND_APP);
//这个设置并不能设置成为前台进程. 通知还需要应用自己发. 此外该设置会忽略该任务的网络限制. 
builder.setFlags(JobInfo.FLAG_WILL_BE_FOREGROUND);
//设置任务延迟执行时间, 不可与setPeriodic(long time)同时使用
builder.setMinimumLatency(time);

//设置设备执行的网络条件JobInfo.NETWORK_TYPE_UNMETERED 不计量网络(wifi), JobInfo.NETWORK_TYPE_NOT_ROAMING 非漫游网络,  NETWORK_TYPE_ANY任何网络
//JobInfo.NETWORK_TYPE_NONE 无论是否有网络都执行
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);

//设置在设备充电时执行
builder.setRequiresCharging(true);
//设置在设备空闲时间执行
builder.setRequiresDeviceIdle(true);

//循环每5秒执行一次
builder.setPeriodic(5000);

//约定的时间内的条件都没有被触发是5秒以后开始触发
builder.setOverrideDeadline(5000);

//生成Job
JobInfo job = builder.build();

//安排Job, 该方法有返回值 JobScheduler.RESULT_SUCCESS 表示安排成功, JobScheduler.RESULT_FAILURE 安排失败
scheduler.schedule(job)

//如果当前的jobId已经被安排了则下取消该安排
final int jobId = (int) info.mId;
scheduler.cancel(jobId);

//安排Job,  packageName 表示那个应用安排的Job(耗电记这个应用的).  userId表示谁安排的Job
scheduler.scheduleAsPackage(builder.build(),  packageName,  UserHandle.myUserId(),  TAG);

2 处理任务.

 当任务安排下去, 应该会被记录在JobScheduler服务里面. 当条件满足时, 处理job对应的JobService会被启动, 否则…

 首先配置和定义JobService

<service
        android:name=".BusinessService"
        android:exported="true"  //这个地方必须是true, 否则外界的应用无法启动该JobService
        android:permission="android.permission.BIND_JOB_SERVICE" //必须定义这个权限
/>
public class BusinessService extends JobService {
        //开始执行Job接口. (必须实现)如果返回false则表示这个Job已经被执行完毕. 如果true则表示这个Job正在被执行. 
        public boolean onStartJob(JobParameters params) {
            final int id = params.getJobId();
            //....开始执行Job

            //1 对于一个瞬间能够完成的任务, 此处可以return false. 
            //2 如果是耗时任务, 则需要在异步线程中执行, 并且返回true. 此外执行完后不要忘记执行jobFinished
            myHandler.removeMessages(id);
            myHandler.sendEmptyMessage(id);
        }

        //Job执行停止, 必须实现,  当接收到任务取消时, 如果该任务没有被结束, 则执行该方法, 否则不执行. 
        public boolean onStopJob(JobParameters params) {
            //此处可以重新安排被取消的任务. 
            scheduler.schedule(job)
        }
        //还有一个方法. jobFinished(JobParameters params, boolean needsRescheduled) 该方法是在任务执行完成时通知系统(不代表任务被执行成功). needsRecheduled表示该任务是否被重复执行. 
        //例如onStartJob执行结果是true. 则实际上任务还在执行. 
        //如果这时候任务执行完了. 就必须调用这个方法否则后面的任务无法进行.  
    }

总结, Scheduler是一套提供给开发者的一套优化耗电的任务安排方式.

其他耗电优化方式请看  app耗电优化

猜你喜欢

转载自blog.csdn.net/tgvincent/article/details/80995896