通过不停的唤醒CPU(通过后天常驻的Service)来达到一些功能的使用,这样会造成电量资源的消耗,比如后台日志的上报,定期更新数据等等,在Android 5.0提供了一个JobScheduler组件,通过设置一系列的预置条件,当条件满足时,才执行对应的操作,这样既能省电,有保证了功能的完整性。
JobScheduler的适用场景:
-
重要不紧急的任务,可以延迟执行,比如定期数据库数据更新和数据上报
-
耗电量较大的任务,比如充电时才执行的备份数据操作。
-
不紧急可以不执行的网络任务,比如在Wi-Fi环境下预加载数据。
-
可以批量执行的任务
-
......等等
JobScheduler的使用
private Context mContext;
private JobScheduler mJobScheduler;
public JobSchedulerManager(Context context){
this.mContext=context;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
this.mJobScheduler= (JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);
}
}
通过getSystemService()方法获取一个JobSchedule的对象。
public boolean addTask(int taskId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
JobInfo.Builder builder = new JobInfo.Builder(taskId,
new ComponentName("com.apk.administrator.loadapk",
JobScheduleService.class.getName()));
switch (taskId) {
case 1:
//每隔1秒执行一次
builder.setPeriodic(1000);
break;
case 2:
//设备重启后,不再执行该任务
builder.setPersisted(false);
break;
default:
break;
}
if (null != mJobScheduler) {
return mJobScheduler.schedule(builder.build()) > 0;
} else {
return false;
}
} else {
return true;
}
}
创建一个JobInfo对象时传入两个参数,第一个参数是任务ID,可以对不同的任务ID做不同的触发条件,执行任务时根据任务ID执行具体的任务;第二个参数是JobScheduler任务的服务,参数为进程名和服务类名。
JobInfo支持以下几种触发条件:
-
setMinimumLatency(long minLatencyMillis):设置任务的延迟时间(单位是ms),需要注意的是,setMinimumLatency与setPeriodic(long time)方法不兼容,同时调用会引起异常。
-
setOverrideDeadline(long maxExecutionDelayMillis):设置任务最晚的延迟时间。如果到了规定时间,其它条件还未满足,这个任务也会被启动。与setMinimumLatency(long time)一样,setOverriddeDeadline与setPeriodic(long time)同时调用会引起异常。
-
setPersisted(boolean isPersisted):设置重启之后,任务是否还要继续执行。
-
setRequiredNetworkType(int networkType):只有满足指定的网络条件时,才会被执行。有三种网络条件,JobInfo.NETWORK_TYPE_NONE不管是否有网络,这个任务都会被执行(如果未设置,这个参数就是默认参数);JobInfo.NETWORK_TYPE_ANY只有在有网络的情况下,任务才会执行,和网络类型无关;JobInfo.NETWORK_TYPE_UNMETERED非运营商网络(比如在Wi-Fi连接时),任务才会被执行。
-
setRequiresCharging(boolean requiresCharging):只有当设备在充电时,这个任务才会被执行。
-
setRequiresDeviceIdle(boolean requiresDeviceIdle):只有当用户没有在使用该设备且有一段时间没有使用时,才会启动该任务。
public class JobScheduleService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
JobService运行在主线程,如果是耗时任务,使用ThreadHandler或者一个异步任务来运行耗时的任务,防止阻塞主线程。
JobScheduleService继承JobService,实现两个方法onStartJob和onStopJob。
任务开始时,执行onStartJob方法,当任务执行完毕后,需要调用jobFinished方法来通知系统;任务执行完成后,调用jobFinished方法通知JobScheduler;当系统接受到一个取消请求时,调用onStopJob方法取消正在等待执行的任务。如果系统在接受到一个取消请求时,实际任务队列中已经没有正在运行的任务,onStopJob不会被调用。
最后在AndroidManifest中配置下:
<service
android:name=".JobScheduleService"
android:permission="android.permission.BIND_JOB_SERVICE" />
扫码_搜索联合传播样式-标准色版.png
Android、Java、Python、Go、PHP、IOS、C++、HTML等等技术文章,更有各种书籍推荐和程序员资讯,快来加入我们吧!关注技术共享笔记。
838794-506ddad529df4cd4.webp.jpg搜索微信“顾林海”公众号,定期推送优质文章。
网友评论