Android 6.0开始,系统引进了一个Doze系统的概念。Doze系统是只当设备被闲置,用户没有对设备有互动的操作,也就是锁屏的情况下,系统过一段时间进入这个Doze模式,其中还有一个定义叫idle模式的在doze的中间,我叫它是深入睡眠。在idle模式下,系统可以关闭一些后台程序,包括常驻的service(就算你是sticky也无力抵抗),网络更新,同步,闹钟,减少它们的活动频率,从而达到省电的目的。虽然有了这个东西,电是省了,但是对于一些实时性要求比较高的app就出了道难题。下面我来说说两个方案。
JobScheduler工作调度器Android 5.0开始引进的一个单例模式的任务调度服务,它可以在idle模式下也可以执行,设备重启后依然有效。JobScheduler在执行任务时会自动唤起cpu的WakeLock,从而达到保活效果。JobScheduler的任务执行完全由系统来支配,包括在idle模式下也如此,我们只需要在任务执行所回调给JobService的onStartJob方法中做实际要保活的内容。当然,系统有权终止这些任务,系统终止了任务回调onStopJob。
下面是获取到JobScheduler服务,然后加入JobInfo工作任务。
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobBuilder.build());
下面再看创建JobInfo工作任务。