【问题标题】:How to set alarm to first Thursday of each month using AlarmManager如何使用 AlarmManager 将闹钟设置为每个月的第一个星期四
【发布时间】:2013-12-07 12:37:35
【问题描述】:

我正在尝试在每个月的第一个星期四发出警报通知。

 am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY*30, sender);

我不能使用上面的代码,因为并非所有月份都有 30 天,有没有办法做到这一点?

这是否表示每个月的第一个星期四?

cal.set(Calendar.DAY_OF_WEEK, 5); // Thursday
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); // Thursday

谢谢

编辑

private void createThursayScheduledNotification() {
        Calendar calendar3 = Calendar.getInstance();
        calendar3.set(Calendar.DAY_OF_WEEK, 5); // Thursday
        calendar3.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); // First Thursday of
                                                            // Each Month
        // Thursday
        calendar3.set(Calendar.HOUR_OF_DAY, 9);
        calendar3.set(Calendar.MINUTE, 0);
        calendar3.set(Calendar.SECOND, 0);
        calendar3.set(Calendar.AM_PM, Calendar.AM);
        AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmMgr.set(AlarmManager.RTC_WAKEUP,
                calendar3.getTimeInMillis(), pendingIntent3); // every first Thursday
        createThursayScheduledNotification();

    }

【问题讨论】:

    标签: java android alarmmanager android-notifications android-alarms


    【解决方案1】:

    由于setRepeating() 不再与 Android 4.4 完全相同,因此最好的解决方案是使用 setExact()(在 Android 4.4 上)或 set()(在 Android 4.3 及更低版本上)。为下个月的第一个星期四设置警报事件。作为处理该事件的一部分,为下个月的第一个星期四设置警报。以此类推。

    【讨论】:

    • 谢谢,但我不太明白,您能否解释得更清楚些 - 为下个月的第一个星期四设置闹钟事件。作为处理该事件的一部分,为下个月的第一个星期四设置闹钟。?
    • @OluleyeIResþektIdowu:我不知道如何更好地解释它。给自己写一个scheduleAnEventForTheFirstThursdayOfNextMonth() 方法。调用一次以设置第一个事件。当该事件被触发时,调用scheduleAnEventForTheFirstThursdayOfNextMonth() 设置下一个事件。请记住,您还需要在重新启动后致电 scheduleAnEventForTheFirstThursdayOfNextMonth(),可能来自 BOOT_COMPLETED BroadcastReceiver
    • 谢谢你,我明白你想告诉我的,如果你能帮我检查一下这个问题,我会很高兴,它与此相关,你的 id 似乎出现在搜索中与此类问题有关。谢谢你。感谢您的意见 - stackoverflow.com/questions/20445481/…
    • 您能否检查我的编辑,我不确定我的方法是否正确,有些东西告诉我它显示的是本月的第一个星期四,而不是你指出的下个月的第一个星期四。如果您可以检查并进行更改,我将很高兴。谢谢n早安
    • @OluleyeIResþektIdowu:“有些东西告诉我它显示的是本月的第一个星期四,而不是你指出的下个月的第一个星期四”——无论何时创建这样的 Calendar 对象,你使用set() 将值放在日期的特定部分,总是存在创建过去日期的风险。通常,我会遇到尝试设置一天中特定时间的人,因此检查日期是否为过去,如果可以修复则添加一天。您可以尝试相同的操作,但如果日期是过去,则添加一个月而不是一天。
    【解决方案2】:

    你可以看看这篇文章

    How to implement yearly and monthly repeating alarms?

    如果您在至少版本 19 上使用 alarmmanager,则可以查看 setWindow()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多