Android AlarmManager 设定过去的时间会触发事件

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

这样设定的触发时间就是明天的了。

相关推荐
马 孔 多 在下雨34 分钟前
安卓开发popupWindow的使用
android
asfdsfgas35 分钟前
从 SSP 配置到 Gradle 同步:Android SDK 开发中 Manifest 合并冲突的踩坑记录
android
zhaoyufei1331 小时前
RK3399 11.0关闭调试串口改为普通RS232通信串口
android·驱动开发
消失的旧时光-19431 小时前
Kotlin 协程最佳实践:用 CoroutineScope + SupervisorJob 替代 Timer,实现优雅周期任务调度
android·开发语言·kotlin
UWA2 小时前
为什么Android游戏画面在30帧运行时有抖动现象
android·游戏
锐湃3 小时前
Android车载多媒体开发MediaSession框架理解
android
yueqc13 小时前
Android 通信机制简析
android·binder·handle
qq_717410017 小时前
FAQ05047:在进入camera或者在camera中切换场景时,出现“很抱歉,相机已停止运行”
android
KevinWang_8 小时前
Activity Result API 的缺点
android
奔跑中的蜗牛6668 小时前
直播APP架构升级和性能优化:WebView 容器化
android