Страницы

Поиск по вопросам

пятница, 31 мая 2019 г.

AlarmReceiver, WakefulBroadcastReceiver и установка будильников

Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего, я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий вопрос: тут мой вопрос
Подскажите, пожалуйста, как реализовать следующую задачу: Есть таблица в БД, в которой находятся записи. Колонки в таблице: [ID][NAME][DAY][HOURS][MINUTES]
Также есть Активити, которую нужно вызывать в заданное время.
То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить Alarm-ы, которые будут вызывать Активити.
Содержимое Активити менять не нужно (оно будет менятся уже в onCreate() самой Активити).
Проблема в том, что я не понимаю, как поставить alarm-ы в множественном числе. Опять-таки, по ссылке, приведённой выше, я показал своё виденье реализации задачи.
Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи не могу двигаться дальше :(


Ответ

Попробуйте в Вашем коде заменить на это:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("alarm message", "alarm message"); if (android.os.Build.VERSION.SDK_INT >= 19) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Просто для разных версий андроида регистрация pendingIntent-a происходит по-разному. Плюс, вы всегда регистрировали его под номером 192837, я заменил его на i, так как эта переменная используется в цикле, и она будет уникальная, и каждый последующий pendingIntent не будет перезаписывать предыдущий.
Если есть необходимость удалить все зарегестрированные интенты, то вызовите такую функцию:
public static void clearAlarmReceiver(Context context, int intentsCount) { for (int i = 0; i < intentsCount; i++) { Intent intent = new Intent(context, CheckAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }

Комментариев нет:

Отправить комментарий