|
|
|
@ -50,6 +50,7 @@ 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;
|
|
|
|
@ -764,67 +765,65 @@ public class MpMasterService extends Service {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void registerHeartbeatTimer() {
|
|
|
|
|
|
|
|
|
|
long timeout = mHeartbeatDuration;
|
|
|
|
|
long delaySec = 20; // 比i1延迟20秒
|
|
|
|
|
long interval = mHeartbeatDuration; // 距离下一次间隔,默认10分钟
|
|
|
|
|
boolean keepAlive = false;
|
|
|
|
|
long currentTimeMs = System.currentTimeMillis();
|
|
|
|
|
long currentSec = System.currentTimeMillis() / 1000;
|
|
|
|
|
|
|
|
|
|
if (mMntnMode) {
|
|
|
|
|
// 无延迟
|
|
|
|
|
delaySec = 0;
|
|
|
|
|
if (mQuickHbMode) {
|
|
|
|
|
timeout = mQuickHeartbeatDuration;
|
|
|
|
|
interval = mQuickHeartbeatDuration;
|
|
|
|
|
}
|
|
|
|
|
registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive);
|
|
|
|
|
registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive);
|
|
|
|
|
} else {
|
|
|
|
|
long closestTime = -1;
|
|
|
|
|
if (mUsingAbsHbTime) {
|
|
|
|
|
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) {
|
|
|
|
|
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) {
|
|
|
|
|
keepAlive = true;
|
|
|
|
|
registerHeartbeatTimer(currentTimeMs + mMpHeartbeatDuration + 5000, keepAlive);
|
|
|
|
|
registerHeartbeatTimer((currentSec + interval + delaySec) * 1000, keepAlive);
|
|
|
|
|
} else {
|
|
|
|
|
registerHeartbeatTimer(zeroPoint + closestTime * 1000, keepAlive);
|
|
|
|
|
registerHeartbeatTimer((todayZero + nextAbsSec) * 1000, keepAlive);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// mUsingAbsHbTime: false
|
|
|
|
|
if ((mPreviousHeartbeatTime != 0) && (mPreviousHeartbeatTime - currentTimeMs < mHeartbeatDuration * 1000)) {
|
|
|
|
|
registerHeartbeatTimer(mPreviousHeartbeatTime + mHeartbeatDuration * 1000, keepAlive);
|
|
|
|
|
} else {
|
|
|
|
|
registerHeartbeatTimer(currentTimeMs + timeout * 1000, keepAlive);
|
|
|
|
|
}
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|