Страницы

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

пятница, 13 марта 2020 г.

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

#android #android_sdk #broadcast_receiver #android_alarm_manager #android_broadcastreceiver


Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему
на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего,
я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий
вопрос: тут мой вопрос.

Подскажите, пожалуйста, как реализовать следующую задачу:
Есть таблица в БД, в которой находятся записи.
Колонки в таблице:
[ID][NAME][DAY][HOURS][MINUTES]

Также есть Активити, которую нужно вызывать в заданное время.

То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить
Alarm-ы, которые будут вызывать Активити.

Содержимое Активити менять не нужно (оно будет менятся уже в onCreate()  самой Активити).

Проблема в том, что я не понимаю, как поставить alarm-ы в множественном числе. Опять-таки,
по ссылке, приведённой выше, я показал своё виденье реализации задачи.

Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи
не могу двигаться дальше :( 
    


Ответы

Ответ 1



Попробуйте в Вашем коде заменить на это: 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(); } }

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

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