diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index bc85bb0f..da06972b 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -50,7 +50,6 @@ import java.lang.reflect.Method; import java.nio.channels.FileLock; import java.text.SimpleDateFormat; import java.util.Arrays; -import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.logging.Level; @@ -765,65 +764,67 @@ public class MpMasterService extends Service { } private void registerHeartbeatTimer() { - long delaySec = 20; // 比i1延迟20秒 - long interval = mHeartbeatDuration; // 距离下一次间隔,默认10分钟 - boolean keepAlive = false; - long currentSec = System.currentTimeMillis() / 1000; + long timeout = mHeartbeatDuration; + boolean keepAlive = false; + long currentTimeMs = System.currentTimeMillis(); if (mMntnMode) { - // 无延迟 - delaySec = 0; if (mQuickHbMode) { - interval = mQuickHeartbeatDuration; + timeout = mQuickHeartbeatDuration; } - registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); + registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive); } else { + long closestTime = -1; if (mUsingAbsHbTime) { - long expandSec = 120; // 扩展2分钟之内的都触发 - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - long todayZero = calendar.getTimeInMillis() / 1000; - long todaySec = currentSec - todayZero; - - long nextAbsSec = this.getNextAbsSec(todaySec); - if (nextAbsSec - todaySec > interval + expandSec) { + Date dt = new Date(); + long ts = dt.getTime(); + ts -= ts % 1000; + + dt.setHours(0); + dt.setMinutes(0); + dt.setSeconds(0); + + long zeroPoint = dt.getTime(); + zeroPoint -= zeroPoint % 1000; + long offsetTs = (ts - zeroPoint) / 1000; + + if (mAbsHeartbeatTimes != null && mAbsHeartbeatTimes.length > 0) { + + for (int i = 0; i < mAbsHeartbeatTimes.length; i++) { + if (mAbsHeartbeatTimes[i] > offsetTs) { + closestTime = mAbsHeartbeatTimes[i]; + break; + } + } + + if (closestTime == -1) { + // next day + closestTime = mAbsHeartbeatTimes[0] + 86400; + } + } else { + closestTime = 9 * 3600 + 13 * 60; + if (offsetTs > closestTime) { + closestTime += 86400; + } + } + + if (zeroPoint + closestTime * 1000 > currentTimeMs + mMpHeartbeatDuration) { keepAlive = true; - registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); + registerHeartbeatTimer(currentTimeMs + mMpHeartbeatDuration + 5000, keepAlive); } else { - registerHeartbeatTimer((todayZero + nextAbsSec) * 1000, keepAlive); + registerHeartbeatTimer(zeroPoint + closestTime * 1000, keepAlive); } } else { - // mUsingAbsHbTime=false,间隔10分钟 + 延迟 - registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive); - } - } - } - - private long getNextAbsSec(long todaySec) { - long nextAbsSec = -1; - if (mAbsHeartbeatTimes != null && mAbsHeartbeatTimes.length > 0) { - for (int i = 0; i < mAbsHeartbeatTimes.length; i++) { - if (mAbsHeartbeatTimes[i] > todaySec) { - nextAbsSec = mAbsHeartbeatTimes[i]; - break; + // mUsingAbsHbTime: false + if ((mPreviousHeartbeatTime != 0) && (mPreviousHeartbeatTime - currentTimeMs < mHeartbeatDuration * 1000)) { + registerHeartbeatTimer(mPreviousHeartbeatTime + mHeartbeatDuration * 1000, keepAlive); + } else { + registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive); } } - - if (nextAbsSec == -1) { - // next day - nextAbsSec = mAbsHeartbeatTimes[0] + 24 * 3600; - } - } else { - nextAbsSec = 9 * 3600 + 13 * 60; - if (todaySec > nextAbsSec) { - nextAbsSec += 24 * 3600; - } } - return nextAbsSec; } + private void registerHeartbeatTimer(long triggerTime, boolean keepAlive) { AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);