Android AlarmManager 设定过去的时间会触发事件
在使用 AlarmManager 做每日定时任务时,发现如果设定的时间小于当前的系统时间,那么设定后会立刻收到一次定时任务回调。
我们设想的是设定的时间应该是明日的这个时间,但是如果打印出设定的时间会发现,设定的时间是今天的。
java
public void addTask() {
Calendar calendar = Calendar.getInstance();
// 设置时区,否则会有 8 个小时的时间差
calendar.setTimeZone(TimeZone.getDefault());
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
long setTime = calendar.getTimeInMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Log.e("WillWolf", "setTime-->" + sdf.format(new Date(setTime)));
long currentTime = System.currentTimeMillis();
Log.e("WillWolf", "currentTime-->" + sdf.format(new Date()));
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTime().getTime(), "TAG", listener, null);
}
日志输出为:
java
setTime-->2024-06-21 15:30:00
currentTime-->2024-06-21 17:31:02
所以,为了避免时间已经过去还引发回调,可以添加一个时间判断。
java
public void addTask() {
Calendar calendar = Calendar.getInstance();
// 设置时区,否则会有 8 个小时的时间差
calendar.setTimeZone(TimeZone.getDefault());
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
long setTime = calendar.getTimeInMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Log.e("WillWolf", "setTime-->" + sdf.format(new Date(setTime)));
long currentTime = System.currentTimeMillis();
Log.e("WillWolf", "currentTime-->" + sdf.format(new Date()));
// 如果当前的时间大于设定的时间,表明设定的时间是未来一天的,做一个加一天的操作
if (currentTime >= setTime) {
calendar.add(Calendar.HOUR, 24);
setTime = calendar.getTimeInMillis();
Log.e("WillWolf", "setTime tomorrow-->" + sdf.format(new Date(setTime)));
}
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTime().getTime(), "TAG", listener, null);
}
日志输出为:
java
setTime-->2024-06-21 15:30:00
currentTime-->2024-06-21 17:31:02
setTime tomorrow-->2024-06-22 15:30:00
这样设定的触发时间就是明天的了。