Java 如何使用AlarmManager将报警设置为每月的第一个星期四
我试图在每个月的第一个星期四发出警报通知Java 如何使用AlarmManager将报警设置为每月的第一个星期四,java,android,alarmmanager,android-notifications,android-alarms,Java,Android,Alarmmanager,Android Notifications,Android Alarms,我试图在每个月的第一个星期四发出警报通知 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
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
谢谢
编辑
由于从Android 4.4开始,
setRepeating()
不再精确,因此最好的解决方案是使用setExact()
(在Android 4.4上)或set()
(在Android 4.3及以下版本上)。为下个月的第一个星期四设置警报事件。作为处理该事件的一部分,为下个月的第一个星期四设置警报。诸如此类。由于自Android 4.4起,setRepeating()
不再精确,因此最好的解决方案是使用setExact()
(在Android 4.4上)或set()
(在Android 4.3及以下版本上)。为下个月的第一个星期四设置警报事件。作为处理该事件的一部分,为下个月的第一个星期四设置警报。等等。你可以看看这篇文章
如果您至少在版本19上使用alarmmanager,您可以看看setWindow()您可以看看这篇文章
如果您至少在版本19上使用alarmmanager,您可以查看setWindow()谢谢,但我不太明白您的意思,您能更好地解释一下吗?为下个月的第一个星期四设置一个报警事件。作为处理该事件的一部分,为下个月的第一个星期四设置警报。@OluleyeIResþektIdowu:我不知道如何更好地解释它。为自己编写一个
scheduleaneventforthefirsthursdayofnextmonth()
方法。调用一次以设置第一个事件。触发该事件后,调用scheduleAntentFortheFirstHurstDayofNextMonth()设置下一个事件。请记住,您还需要在重新启动后调用scheduleanetforthefirsthursdayofnextmonth()
,可能是从启动完成后的广播接收器
。谢谢,我有点明白您的意思,如果您能帮我检查一下这个问题,我将非常高兴,它与此相关,您的id似乎出现在与此类问题相关的搜索中。非常感谢。我很感激你的意见-请你检查一下我的编辑,我不确定我的方法是否正确,有些东西告诉我它显示的是一个月的第一个星期四,而不是你指出的下个月的第一个星期四。如果您能检查并进行更改,我将非常高兴。谢谢,很好Morning@OluleyeIResþektIdowu:“有些东西告诉我它显示的是一个月的第一个星期四,而不是你所指的下个月的第一个星期四”——每当创建这样一个日历
对象时,使用set()
在日期的特定部分输入值,你总是有在过去创建日期的风险。通常,我会遇到这样的情况,人们试图在一天中设置一个特定的时间,因此检查日期是否在过去,如果是,则添加一天。你也可以尝试同样的方法,但是如果日期是过去的话,可以增加一个月而不是一天。谢谢,但是我不太明白你的意思,你能解释得更好吗?为下个月的第一个星期四设置一个警报事件。作为处理该事件的一部分,为下个月的第一个星期四设置警报。@OluleyeIResþektIdowu:我不知道如何更好地解释它。为自己编写一个scheduleaneventforthefirsthursdayofnextmonth()
方法。调用一次以设置第一个事件。触发该事件后,调用scheduleAntentFortheFirstHurstDayofNextMonth()
设置下一个事件。请记住,您还需要在重新启动后调用scheduleanetforthefirsthursdayofnextmonth()
,可能是从启动完成后的广播接收器
。谢谢,我有点明白您的意思,如果您能帮我检查一下这个问题,我将非常高兴,它与此相关,您的id似乎出现在与此类问题相关的搜索中。非常感谢。我很感激你的意见-请你检查一下我的编辑,我不确定我的方法是否正确,有些东西告诉我它显示的是一个月的第一个星期四,而不是你指出的下个月的第一个星期四。如果您能检查并进行更改,我将非常高兴。谢谢,很好Morning@OluleyeIResþektIdowu:“有些东西告诉我它显示的是一个月的第一个星期四,而不是你所指的下个月的第一个星期四”——每当创建这样一个日历
对象时,使用set()
在日期的特定部分输入值,你总是有在过去创建日期的风险。通常,我会遇到这样的情况,人们试图在一天中设置一个特定的时间,因此检查日期是否在过去,如果是,则添加一天。你也可以尝试同样的方法,但是如果日期是过去的话,可以增加一个月而不是一天。
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();
}