AlarmManagerService 时钟对齐

AlarmManager方法

setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法用于设置重复闹钟,第1个参数表示闹钟类型,第2个参数表示闹钟首次执行时间,第3个参数表示闹钟两次执行的间隔时间,第4个参数表示执行的动作

绝对时间代表 SystemClock.elapsedRealtime()
相对时间代表 System.currentTimeMillis()

闹钟的类型

AlarmManager.ELAPSED_REALTIME

使用相对时间,在手机睡眠状态下不可用

AlarmManager.ELAPSED_REALTIME_WAKEUP

使用相对时间,在睡眠状态下会唤醒系统并执行提示功能

AlarmManager.RTC

使用绝对时间,在睡眠状态下不可用

AlarmManager.RTC_WAKEUP

使用绝对时间,在睡眠状态下会唤醒系统并执行提示功能

AlarmManager.POWER_OFF_WAKEUP

使用绝对时间,在手机关机状态下也能正常进行提示

时钟对齐原理

比如有3个应用,QQ,微信,陌陌

QQ 每隔5s 就需要向服务器请求数据

微信 每隔7s 就需要向服务器请求数据

陌陌 每隔9s 就需要向服务器请求数据

也就是系统在30s之内,就需要唤醒系统13次

了解时钟对齐

比如我们设定系统每隔3s唤醒一次

对齐后时间 = 3 + (重复时间 - (重复时间 % 3))

系统在30s之内,只需要唤醒系统10次

比如时间间隔设为每隔10s唤醒一次

系统在30s之内,只需要唤醒系统3次

而时钟对齐则可以减少系统唤醒次数,达到省电的目的。

AlarmManagerService 时钟对齐
修改setRepeating 方法

long startTime


long lstartTime = startTime;
long l1 = paramLong % 5000L;
if (l1!=0L){
    lstartTime = 5000L+ (lstartTime - l1);
}

long intervalTime


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 方法


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;
}

你可能感兴趣的:(AlarmManagerService 时钟对齐)