电量优化(四)JobSchedule

2019-02-12  本文已影响4人  贾里

手机消耗电脑的顺序:屏幕、蜂窝网络、wifi、GPS

将很多次网络访问,几集中在一个时间段内访问,就会减少电量的消耗;也会减少CPU的启动次数;
有大量的网络访问放在JobScheduler中处理;

JobSchedule的使用
JobSchedule简单使用,可以放在服务中处理,参考官方demo

 public void execut(View view) {
        wakelock_text.setText("正在下载....");
//        for (int i = 0; i < 500; i++) {
//            mWakelock.acquire();//唤醒CPU
//            wakelock_text.append(i+"连接中……");
////            wakelock_text.append("");
//            //下载
//            if (isNetWorkConnected()) {
//                new SimpleDownloadTask().execute();
//            } else {
//                wakelock_text.append("没有网络连接。");
//            }
//        }

        //优化
        JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        for (int i = 0; i < 500; i++) {
            JobInfo jobInfo = new JobInfo.Builder(i,serviceComponent)
                    .setMinimumLatency(5000)//5秒 最小延时、
                    .setOverrideDeadline(60000)//maximum最多执行时间
//                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//免费的网络---wifi 蓝牙 USB
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//任意网络---
            /**
             设置重试/退避策略,当一个任务调度失败的时候执行什么样的测量采取重试。
             initialBackoffMillis:第一次尝试重试的等待时间间隔ms
             *backoffPolicy:对应的退避策略。比如等待的间隔呈指数增长。
             */
//                    .setBackoffCriteria(long initialBackoffMillis, int backoffPolicy)
                    .setBackoffCriteria(JobInfo.MAX_BACKOFF_DELAY_MILLIS, JobInfo.BACKOFF_POLICY_LINEAR)
//                    .setPeriodic (long intervalMillis)//设置执行周期,每隔一段时间间隔任务最多可以执行一次。
//                    .setPeriodic(long intervalMillis,long flexMillis)//在周期执行的末端有一个flexMiliis长度的窗口期,任务就可以在这个窗口期执行。
                    //设置设备重启后,这个任务是否还要保留。需要权限:RECEIVE_BOOT_COMPLETED //ctrl+shift+y/u x
//                    .setPersisted(boolean isPersisted);
//                    .setRequiresCharging(boolean )//是否需要充电
//                    .setRequiresDeviceIdle(boolean)//是否需要等设备出于空闲状态的时候
//                    .addTriggerContentUri(uri)//监听uri对应的数据发生改变,就会触发任务的执行。
//                    .setTriggerContentMaxDelay(long duration)//设置Content发生变化一直到任务被执行中间的最大延迟时间
                    //设置Content发生变化一直到任务被执行中间的延迟。如果在这个延迟时间内content发生了改变,延迟时间会重写计算。
//                    .setTriggerContentUpdateDelay(long durationMilimms)
                    .BUILD();


            jobScheduler.schedule(jobInfo);
        }

    }

在国外统一使用GCM,就会耗电少一点,在国内,不同的应用用自己的服务,导致耗电很高。
Doze优化,会尽量限制应用长时间未休眠

5.0API以后用的JobScheduler
5.0API之前用GCM---谷歌的Google Play ServiceManager,国内基本是废的。(里面有很多的网络优化的代码--包括访问策略等)

JobScheduler是系统级别的,通过调用系统服务(AIDL)的方法
JobScgeduler源码分析

进程1
MyService{
    MyBinder extends MyInterface.Stub{
        a(){
        //
        }
    }
}

MyInterface.aidl{
    接口方法a();
}

进程2
MyInterface.aidl{
    接口方法a();
}

bindService(service,new ServiceConnection(){
    onServiceConnected(IBinder binder){
        //建立连接
        MyInterface interface = binder.asInterface();

    }
})

interface.a();

Zygote进程--Linux核心
启动系统进程SystemServer,开启一些列的关键服务:AMS/PMS/WMS/JobSchedulerService
/data/system/job/jobs.xml文件---永久的任务。

上一篇 下一篇

猜你喜欢

热点阅读