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

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

相关推荐
草莓熊Lotso14 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
程序员煊子20 小时前
用 Cursor 从零搭一个 Compose 本地记账 App:实战记录与源码解析
android·kotlin·compose·cursor
alexhilton21 小时前
面向Android开发者的Google I/O 2026
android·kotlin·android jetpack
私人珍藏库1 天前
【Android】豆图助手-永久HY-模拟微X~zfb各种截图
android·app·工具·软件·多功能
程序员陆业聪1 天前
Shadow实战接入与生产落地:从零搭建到稳定运行
android
程序员陆业聪1 天前
Shadow Transform:编译期的魔法——字节码替换实战
android
imuliuliang1 天前
Laravel6.x核心特性全解析
android·php·laravel
idingzhi1 天前
A股量化策略日报(2026年05月22日)
android·开发语言·python·kotlin
测试员周周1 天前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium
赏金术士1 天前
Android 动画对比指南:View 系统 vs Jetpack Compose
android·kotlin·compose