如何避免超过闹钟时间触发闹钟?

Posted

技术标签:

【中文标题】如何避免超过闹钟时间触发闹钟?【英文标题】:How to avoid the alarm triggering when the alarm time is past? 【发布时间】:2015-06-10 18:09:05 【问题描述】:

我已安排在每天上午 10 点触发警报。

我将在星期一上午 12 点设置此闹钟。

如果警报时间已过,则警报将立即触发。

但出于我的要求,我不想立即触发。我可以在第二天上午 10 点触发。

下面是我当前设置闹钟的代码:

Calendar activeModeTime = Calendar.getInstance();
    // activeModeTime.setTimeZone(TimeZone.getTimeZone(Constants.TIME_ZONE));
    activeModeTime.set(Calendar.HOUR_OF_DAY,
            mSharedPrefManager.getActiveStartHourPref());
    activeModeTime.set(Calendar.MINUTE,
            Constants.DEFAULT_ACTIVE_START_MINUTE);
    activeModeTime.set(Calendar.SECOND,
            Constants.ALL_START_END_DEFAULT_SECOND);

    mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            activeModeTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
            getActiveModeAlarmPendingIntent());

我如何做到这一点。

【问题讨论】:

设置为后天。 我可以设置为星期二.. 但是下周星期一我需要这个闹钟 na... 怎么做? 只需设置下一个日期。 【参考方案1】:

检查您设置的时间是否为过去,如果是,则将触发时间增加 24 小时。

if(activeModeTime < System.currentTimeMillis())
    activeModeTime += AlarmManager.INTERVAL_DAY;

【讨论】:

是否有参数可以设置为过去时间不触发。 不,setRepeating() 方法在 AlarmManager 中没有重载,所以我们无法为这个 atm 传递参数。 而且 API 19 及更高版本的警报也不准确。我正在设备 4.4.4 中进行测试。我安排了上午 10 点的闹钟。现在时间是上午 10.15 点。仍然没有触发警报。有具体的延迟时间吗? 它应该在时间过去后立即触发,但是什么时候停止工作,因为在你提到的问题中“如果警报时间过去了,那么警报将立即触发。”。确保警报准确按时触发的一种方法是设置一次性警报,并在您处理警报传递时安排下一个警报。 我也不能设置一个时间闹钟。即使是一次性设置方法也与 api 19 不精确。【参考方案2】:

写入间隔而不是 REPEATING_INTERVAL。 对于上述上午 10 点的示例,您需要在下面的代码中编写 AlarmManager.INTERVAL_DAY 而不是 REPEATING_INTERVAL。

if(Calendar.getInstance().getTimeInMillis()>=calendar.getTimeInMillis())
   timeInMillis = calendar.getTimeInMillis() + REPEATING_INTERVAL;
else  
   timeInMillis = calendar.getTimeInMillis();


alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis,REPEATING_INTERVAL, pendingIntent);

【讨论】:

请编辑您的帖子并为您的代码添加一些解释。

以上是关于如何避免超过闹钟时间触发闹钟?的主要内容,如果未能解决你的问题,请参考以下文章

如果当天的闹钟时间已经过去,android会阻止立即触发闹钟服务

如何添加警报声音(音频)?

如何在 Flutter 中设置闹钟?

如何在iphone中设置选定日期的闹钟?

如何使用 UIDatePicker 设置闹钟?

如何在 SwiftUI watchOS 上创建闹钟