Многочисленные тревоги с AlarmManager

Я в настоящее время в конце моего ума.

В моем приложении пользователь может установить будильник, выбрав нужные дни недели и время.

Приведенная ниже функция проверяет набор правил и ищет правила, имеющие критерии времени. В этих случаях он будет устанавливать будильник для каждого выбранного дня и повторять его (каждые 7 дней).

Я прочитал довольно много сообщений о значении нескольких сигналов тревоги (в отличие от одного). Я думаю, что я принял во внимание следующее:
- Использование свежего намерения для каждой тревоги
- Использование свежего PendingIntent для каждого будильника
- Использование другого кода запроса для каждой тревоги

Коды запроса собраны в ArrayList, поэтому другая функция может сбросить все тревоги при выходе из программы.

Теперь проблема: мои тревоги не сработают. Мне удалось отследить ошибку этой функции. Экземпляр AlarmManager в порядке. Я устанавливаю тестовую тревогу в самом низу (после строки со звездочками). Это стреляет. Зачем???

clearAlarms();
int i=0;    
ArrayList<Rule> allRulesWithTimeFrames = new ArrayList<Rule>();
allRulesWithTimeFrames = Rule.findRuleCandidatesByTimeFrame();
for(Rule oneRule : allRulesWithTimeFrames)
{
    for(Trigger oneTrigger : oneRule.getTriggerSet())
    {
        if(oneTrigger.getTriggerType() == Event_Enum.timeFrame)
        {
            Calendar calNow, calSet;
            Time setTime;

            if(oneTrigger.getTriggerParameter())
                 setTime = oneTrigger.getTimeFrame().getTriggerTimeStart();
            else
                 setTime = oneTrigger.getTimeFrame().getTriggerTimeStop();

            calNow = Calendar.getInstance();            
            calSet = (Calendar) calNow.clone();
            calSet.set(Calendar.HOUR_OF_DAY, setTime.getHours());
            calSet.set(Calendar.MINUTE, setTime.getMinutes());
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);
            // At this point calSet would be a scheduling candidate. It's just the day the might not be right, yet.

            long milliSecondsInAWeek = 1000 * 60 * 60 * 24 * 7;

            for(int dayOfWeek : oneTrigger.getTimeFrame().getDayList())
            {
                // --------------------
                // Here's a lot of code I will spare you. It only changes
                // the variable calSetWorkingCopy.
                // --------------------

                SimpleDateFormat sdf = new SimpleDateFormat("E dd.MM.yyyy HH:mm");
                i++;
                String calSetWorkingCopyString = sdf.format(calSetWorkingCopy.getTime()) + " RequestCode: " + String.valueOf(i);
                Miscellaneous.logEvent("i", "AlarmManager", "Setting repeating alarm because of rule: " + oneRule.getName() + " beginning at " + calSetWorkingCopyString);

                Intent alarmIntent = new Intent(automationServiceRef, AlarmListener.class);
                PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, i, alarmIntent, 0);
                centralAlarmManagerInstance.setInexactRepeating(AlarmManager.RTC_WAKEUP, calSetWorkingCopy.getTimeInMillis(), milliSecondsInAWeek, alarmPendingIntent);
                requestCodeList.add(i);
            }
         }
    }
}

        // ************* The below code is working *************
    // get a Calendar object with current time
    Calendar cal = Calendar.getInstance();
    // add 5 minutes to the calendar object
    cal.add(Calendar.SECOND, 10);
    SimpleDateFormat sdf2 = new SimpleDateFormat("E dd.MM.yyyy HH:mm");
    String calSetWorkingCopyString2 = sdf2.format(cal.getTime());
    Miscellaneous.logEvent("i", "AlarmManager", "Setting repeating alarm because of hardcoded test: beginning at " + calSetWorkingCopyString2);
    Intent alarmIntent2 = new Intent(automationServiceRef, AlarmListener.class);
    PendingIntent alarmPendingIntent2 = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent2, 0);
    centralAlarmManagerInstance.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, alarmPendingIntent2);
    requestCodeList.add(0);

1 ответ

Попробуйте заменить это

PendingIntent alarmPendingIntent2 = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent2, 0);

с этим

PendingIntent alarmPendingIntent2 = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent2, PendingIntent.FLAG_CANCEL_CURRENT);
Другие вопросы по тегам