Отслеживайте несколько будильников с Android

Мне нужно установить несколько будильников, которые будут повторяться еженедельно, чтобы телефон автоматически вибрировал, когда пользователь находится на каком-либо занятии (это академическое приложение), а затем сбрасывал громкость по окончании занятия.

У меня уже есть создаваемые сигналы тревоги, но у меня должен быть способ деактивировать их все, если пользователь отключит эту функцию. Я также знаю, что должен сделать это, передав и указав те же параметры методу AlarmManager.cancel(), но проблема здесь в следующем:

Пользователь может отменить занятия и записаться на занятия (но не напрямую в приложении), и это обновляется и отражается в БД, в которой хранятся только текущие занятия. Итак, если у меня есть настройка будильника для класса, которого больше не существует, как я могу отменить его, если я не могу реплицировать PendingIntent?

Одно из решений, которое я вижу здесь, состоит в том, чтобы создать таблицу БД для отслеживания текущих аварийных сигналов, тогда у меня будет полный контроль над ними, другим способом будет отмена и сброс всех аварийных сигналов при обновлении списка классов, но для этого требуется справедливое количество времени, а третий, но менее удобный вариант — просто подождать, пока пользователь загрузит телефон, и при сбросе сигналов тревоги просто установить те, которые мне нужны (исправьте, если я ошибаюсь в этом поведении при загрузке). Есть ли четвертый вариант, который я должен попробовать, или один из этих, если он достаточно хорош?


person Rodrigo Castro    schedule 02.05.2012    source источник


Ответы (1)


Во-первых, вам не нужно настраивать несколько будильников. Просто установите СЛЕДУЮЩИЙ будильник, а затем, когда он сработает, установите новый следующий будильник. Это также упрощает повторную настройку будильника, когда он потерян, если телефон перезагружается, поскольку у вас есть только один будильник, о котором нужно подумать.

Я использую эту небольшую процедуру для установки будильника. Значение параметра Set определяет, установлена ​​ли тревога или отменена.

public static void SetMyAlarm(Context c, long AlarmTime, Boolean Set) {
    Intent intent = new Intent(c, AlarmReceiver.class); // The broadcast receiver that will handle my alarm 

    int UniqueID =8192; // id for this specific alarm, use a different id for each separate alarm

    PendingIntent sender = PendingIntent.getBroadcast(c, UniqueID, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
    if (Set) {
        am.set(AlarmManager.RTC_WAKEUP, AlarmTime, sender);
    } else {
        am.cancel(sender);
    }
}
person Kuffs    schedule 02.05.2012
comment
Спасибо, это на самом деле довольно умный способ сделать это. Таким образом, я могу легко отслеживать активную тревогу с помощью SharedPreferences. попробую вот это - person Rodrigo Castro; 02.05.2012
comment
Чтобы не быть педантичным, но логическое значение в сигнатуре метода может (должно?) быть примитивом. Нет причин, чтобы этого не было. - person Michael De Soto; 31.10.2016
comment
Это на самом деле очень педантично, но да, так и должно быть. Я уверен, что вы найдете много, много опечаток на этом сайте. Четыре года назад, я не думаю, что ОП заботился о том, что я случайно набрал заглавную Б, когда пытался ему помочь. - person Kuffs; 01.11.2016
comment
@Kuffs Хороший ответ. У меня есть введенные пользователем даты выполнения, хранящиеся в базе данных SQLite. Я хочу, чтобы пользователь получал уведомление за 24 часа до наступления каждого срока. Итак, не могли бы вы предложить настроить один будильник для ближайшей даты родов, которая скоро наступит, и поэтому мне просто нужно найти ближайшую дату родов в столбце сроков? - person AJW; 21.03.2018
comment
Это почти то, что я сказал в своем ответе, так что да - person Kuffs; 21.03.2018