为了节省电量节省用户流量,需要在充电状态和WiFi时去执行某一后台耗时操作,而service并不能直接支持,需要自己去加入功能监听充电状态的广播和网络状态的广播。加大代码量的同时,也加大了逻辑复杂度,程序变得不易维护。这时可以使用JobScheduler来实现。
工作调度(JobScheduler)
介绍:This is an API for scheduling various types of jobs against the framework that will be executed in your application's own process.
实例化:Context.getSystemService(Context.JOB_SCHEDULER_SERVICE)。
常用方法:
cancel(int jobId)取消指定的工作
cancelAll()取消全部作业
其他方法:
enqueue(JobInfo job, JobWorkItem work)
getAllPendingJobs()检索调用应用程序调度的所有作业
getPendingJob(int jobId)查看预定作业的描述
工作描述(JobInfo)
介绍:通过内部的Builder类设置任务执行的条件,比如:充电状态,网络状态,空闲状态等。
实例化: JobInfo.Builder().build()
后台工作(JobService)
介绍:这是处理先前调度的异步请求的基类。重写onStartJob(JobParameters)和onStopJob(JobParameters params)
,这是你实现工作逻辑的地方。
实现:
jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);//获取JobScheduler JobInfo.Builder builder = new JobInfo.Builder(123, new ComponentName(this, MyJobService.class)); builder.setMinimumLatency(5000);//最小延迟时间 builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);//网络类型 builder.setRequiresCharging(true);//需要充电 jobScheduler.schedule(builder.build());//将JobInfo加入调度。
public class MyJobService extends JobService { @Override public boolean onStartJob(JobParameters params) {//实现工作逻辑,主线程中执行 Log.e("MyJobService", "onStartJob:" + "设备正在充电!"+"ThreadName:"+Thread.currentThread().getName()); return false; } @Override public boolean onStopJob(JobParameters params) { Log.e("MyJobService", "onStopJob"); return false; } }
另外需要注意在AndroidManifest中注册
<service android:name=".service.MyJobService" android:permission="android.permission.BIND_JOB_SERVICE" />