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

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

相关推荐
lxysbly34 分钟前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者84 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20354 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥4 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓4 小时前
[JDBC]元数据
android
独行soc4 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能4 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿4 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc5 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20355 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos