重复警报周特定日期android

时间:2016-04-11 14:03:47

标签: android alarmmanager android-alarms

在我的应用程序中,我有一个触发4 senerios警报的功能:

  • 用户选择的日期和时间只有一次
  • 每日所选时间
  • 根据所选日期和时间每周
  • 用户选择的一周中的自定义日期

我使用以下内容成功实施了前3个senerios:

只有一次:

ftime

对于每日安排:

timezone

对于每周安排(根据系统日期):

tm_gmtoff

对于用户选择的自定义工作日(例如,仅适用于星期一和星期五,每周重复一次)我使用的是与迭代时每周调度相同的代码。但它不适用于星期一(星期五之前设定)和星期五工作。此外,如果今天(系统日期)是星期一或星期五,它不会触发今天的警报。

那么如何为一周中的自定义日实施每周警报计划?

4 个答案:

答案 0 :(得分:10)

您无法告诉闹钟管理员您想要触发的日期。

一种解决方案是针对您希望每周重复触发一周的每一天发出警报。

因此,对于周一和周五的情况,您可以在周一设置每周重复提醒,并在周五设置每周重复提醒。

示例代码:

Julia()

答案 1 :(得分:1)

1) sunday=1, moday=2;, tuesday=3,......saturday=7  
2)selectedDays.size()*(it will be which date you have selected , if you seleted monday , tues ,friday , then it will 3 size )*    

3) for time if we choose from datetimepicker  
 **String[] timespilt = tv_timepicker.getText().toString().split(":");**


     for (int i = 0; i < selectedDays.size(); i++) {

         // for alarm ...
           calNow = Calendar.getInstance();
           calSet = (Calendar) calNow.clone();

            int day = calSet.get(Calendar.DAY_OF_WEEK); 
        calSet.set(Calendar.HOUR_OF_DAY,Integer.parseInt(timespilt[0].trim()));
                                        calSet.set(Calendar.MINUTE, Integer.parseInt(timespilt[1].trim()));
                                        calSet.set(Calendar.SECOND, 0);
                                        calSet.set(Calendar.MILLISECOND, 0);
                                        calSet.set(Calendar.DAY_OF_WEEK,selectedDays.get(i));


                                    if (calSet.compareTo(calNow) <= 0) {
                                        //Today Set time passed, count to tomorrow
                                        calSet.add(Calendar.DATE,7);

                                    }



                            System.out.println("set time for alarmweekly==="+calSet.getTime());
                            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                            PendingIntent alarmPI = PendingIntent.getBroadcast(this, (int) insertedId+selectedDays.get(i), alarmIntent,  0);

                            alarmManager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), alarmPI);

                            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                                    calSet.getTimeInMillis(), (DateUtils.DAY_IN_MILLIS) * 7,
                                    alarmPI);
}

答案 2 :(得分:0)

您已经说过,您使用的是每周调度的相同代码,“通过迭代”。如果我了解您尝试使用相同的PendingIntent设置多个警报(在您的示例中为两个)。

问题在于documentation says

  

当您设置使用相同待处理意图的第二个警报时,它   取代原来的警报。

这只是触发第二个警报的方式。

因此,为了解决您的问题,您只需为每个计划使用不同的PendingIntent

答案 3 :(得分:0)

这将解决您的问题。

private void scheduleAlarm(int dayOfWeek) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);

        // Accept the change here at this line to avoid skipping of current week.
        if(calendar.getTimeInMillis() < System.currentTimeMillis()) {
             calendar.add(Calendar.DAY_OF_YEAR, new GregorianCalendar().get(Calendar.DAY_OF_WEEK)-1);
        }

        // Set this to whatever you were planning to do at the given time
        PendingIntent yourIntent; 

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, yourIntent);
    }

    private void setUpAlarms() {

        scheduleAlarm(Calendar.MONDAY);
        scheduleAlarm(Calendar.FRIDAY);
    }

这里要集中精力避免跳过本周。 :

calendar.add(Calendar.DAY_OF_YEAR, new GregorianCalendar().get(Calendar.DAY_OF_WEEK)-1);