手机消耗电脑的顺序:屏幕、蜂窝网络、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源码分析
- JobInfo
- JobScheduler
- JobService
进程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文件---永久的任务。
网友评论