为什么80%的码农都做不了架构师?>>>
AlarmManager方法
setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);<br> 该方法用于设置重复闹钟,第1个参数表示闹钟类型,第2个参数表示闹钟首次执行时间,第3个参数表示闹钟两次执行的间隔时间,第4个参数表示执行的动作
绝对时间代表 SystemClock.elapsedRealtime() 相对时间代表 System.currentTimeMillis()
闹钟的类型
AlarmManager.ELAPSED_REALTIME <br> 使用相对时间,在手机睡眠状态下不可用
AlarmManager.ELAPSED_REALTIME_WAKEUP<br> 使用相对时间,在睡眠状态下会唤醒系统并执行提示功能
AlarmManager.RTC<br> 使用绝对时间,在睡眠状态下不可用
AlarmManager.RTC_WAKEUP<br> 使用绝对时间,在睡眠状态下会唤醒系统并执行提示功能
AlarmManager.POWER_OFF_WAKEUP<br> 使用绝对时间,在手机关机状态下也能正常进行提示
时钟对齐原理
比如有3个应用,QQ,微信,陌陌
QQ 每隔5s 就需要向服务器请求数据<br> 微信 每隔7s 就需要向服务器请求数据<br> 陌陌 每隔9s 就需要向服务器请求数据<br>
也就是系统在30s之内,就需要唤醒系统13次
了解时钟对齐<br>
比如我们设定系统每隔3s唤醒一次<br> 对齐后时间 = 3 + (重复时间 - (重复时间 % 3))<br> 系统在30s之内,只需要唤醒系统10次<br> 比如时间间隔设为每隔10s唤醒一次<br> 系统在30s之内,只需要唤醒系统3次<br>
而时钟对齐则可以减少系统唤醒次数,达到省电的目的。<br>
AlarmManagerService 时钟对齐 修改setRepeating 方法
long startTime
<!-- lang: java -->
long lstartTime = startTime;
long l1 = paramLong % 5000L;
if (l1!=0L){
lstartTime = 5000L+ (lstartTime - l1);
}
long intervalTime
<!-- lang: java -->
long l1 = 0L, l2 = 0L;
if (type== 2) {
l1 = System.currentTimeMillis() - SystemClock.elapsedRealtime();
} else {
l1 = 0L;
}
l2 = (intervalTime+ l1) % 5000L;
if (l2 != 0L) {
lintervalTime= 5000L+ (intervalTime- l2);
}
setRepeating 方法
<!-- lang: java -->
synchronized (this.mLock)
{
Alarm localAlarm = new Alarm();
localAlarm.type = paramInt;
localAlarm.when = lstartTime;
localAlarm.repeatInterval = lintervalTime;
localAlarm.operation = paramPendingIntent;
removeLocked(paramPendingIntent);
if (addAlarmLocked(localAlarm) == 0)
setLocked(localAlarm);
return;
}