2015-05-19 2 views
0

Я пытаюсь разработать систему напоминаний, поэтому пользователь может вводить дни для напоминаний (MON, TUE ...) и раз, когда это напоминание будет срабатывать (только час и минуты). Это может быть любой день недели или несколько дней недели. Вот код для установки этих напоминаний:Тревожный менеджер: повторяющийся сигнал тревоги не всегда срабатывает

 final AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     for (final Day day: reminder.getDays()) { 
      for (final ReminderTime reminderTime: reminder.getTimes()) { 
       final Calendar calendar = Calendar.getInstance(); 
       calendar.set(Calendar.HOUR_OF_DAY, reminderTime.getHour()); 
       calendar.set(Calendar.MINUTE, reminderTime.getMinute()); 
       calendar.set(Calendar.SECOND, 0); 
       calendar.set(Calendar.DAY_OF_WEEK, day.getCalendarDay()); 

       if (calendar.getTimeInMillis() < System.currentTimeMillis()) { 
        // final long daysDifference = DateUtils.getDaysDifference(calendar.getTimeInMillis(), System.currentTimeMillis()); 
        // calendar.add(Calendar.DAY_OF_YEAR, (int) (daysDifference + 1)); 
        calendar.add(Calendar.DAY_OF_YEAR, 7); 
       } 

       final Intent intent = createReminderIntent(context, reminder.getReminderType(), reminderTime, day); 
       final PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
       alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, sender); 
      } 
     } 

Сигнал я получаю позже в обычае BroadcastReceiver. Проблема в том, что напоминание время от времени стреляет, а иногда и нет, мне кажется, что что-то беспокоит дни. Мне интересно, была ли ошибка или что я делаю неправильно?

+0

Вы устанавливаете одинаковый код запроса (ноль) для всех ожидающих намерений. Последний заменяет всех, кто пришел перед ним. Используя переменный код запроса, его следует исправить. Прочитайте обзор класса 'PendingIntent' (http://developer.android.com/reference/android/app/PendingIntent.html), чтобы понять, как это работает. –

+0

Под переменным запросом вы подразумеваете всегда новый код запроса? Я знаю, как работает этот «PendingIntent», однако я не понимаю, почему нулевой код запроса недействителен для такого случая? Я думал, что флаг, который я устанавливаю в последнем параметре, определяет, будет ли он заменен, обновлен или отменен. –

+0

Действительно, но вы хотите планировать одно и то же намерение несколько раз. Поэтому вам нужно создавать разные ожидающие намерения для каждого повторяющегося цикла. Один из способов обеспечить использование разных кодов запросов. –

ответ

1

При вызове PendingIntent.get*(...) с тем же Intent и код запроса тот же экземпляр PendingIntent возвращается.

У AlarmManager может быть только одно правило, связанное для одного PendingIntent, что означает, что только последний сигнал тревоги, установленный AlarmManager.setRepeating(...) в вашем коде, фактически активен. Остальные были переписаны этим последним правилом.

Один из способов дифференциации PendingIntent с тем же Intent состоит в том, чтобы использовать для каждого другого код запроса. Когда они пройдут до AlarmManager, они будут запускать отдельные аварийные сигналы, как ожидалось.

К сожалению, нет способа отменить несколько сигналов тревоги, например. на базе Intent так что вы должны либо

  • сохранить все ваши PendingIntent экземпляров, используемых первоначально для планирования аварийных сигналов
  • сохранить все коды запроса и восстановить указанный PendingIntent сек
  • или использовать подобный механизм.

Для этого необходимо позвонить AlarmManager.cancel(pi) с каждым из этих PendingIntent s для отмены соответствующих аварийных сигналов.

0
Calendar Calendar_Object = Calendar.getInstance(); 

    Calendar_Object.set(Calendar.DAY_OF_WEEK, 6); 


    Calendar_Object.setTimeInMillis(System.currentTimeMillis()); 
    Calendar_Object.set(Calendar.HOUR_OF_DAY, 16); 
    Calendar_Object.set(Calendar.MINUTE, 51); 
    Calendar_Object.set(Calendar.SECOND, 0); 

    // MyView is my current Activity, and AlarmReceiver is the 
    // BoradCastReceiver 
    Intent myIntent = new Intent(MyView.this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(MyView.this, 
      0, myIntent, 0); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    /* 
    * The following sets the Alarm in the specific time by getting the long 
    * value of the alarm date time which is in calendar object by calling 
    * the getTimeInMillis(). Since Alarm supports only long value , we're 
    * using this method. 
    */ 

     Long alarmTime = Calendar_Object.getTimeInMillis(); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime, 7 * 24 * 60 * 60 * 1000 , pendingIntent); 
+0

Я пробовал это, но это ничего не меняет, время для календаря в миллисекундах правильное. –

+0

, пожалуйста, попробуйте этот код, он хорошо работает в моем приложении. –

+0

Я попробую его позже, спасибо. –

Смежные вопросы