Android AlarmManager - Планирование повторяющегося намерения срабатывать два раза в день - PullRequest
1 голос
/ 06 января 2012

После прочтения большого количества примеров кода в этом вопросе я пытаюсь найти самый простой способ добиться следующего:

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

Однако я не уверен, является ли следующий код правильным способом установки и отмены сигналов тревоги.

//Static function for setting the alarm
//My midday calendar object (cal1)

...

//My evening calendar object (cal2)
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE)
Intent myIntent = new Intent(context, MyAlarmReceiver.class);

    PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE);
    PendingIntent secondCallIntent= PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE);
    if(firstCallIntent == null){
        if(DEBUG){
            Log.d(TAG, "Setting Midday Alarm");
        }
        firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0);
        alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, firstCallIntent);
    }
    if(secondCallIntent == null){
        if(DEBUG){
            Log.d(TAG, "Setting Evening Alarm");
        }
        secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0);
        alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, secondCallIntent);
    }


//Static call to cancel the alarm.
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE)
Intent myIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0);
alarms.cancel(firstCallIntent);
firstCallIntent.cancel();
PendingIntent secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0);
alarms.cancel(secondCallIntent);
secondCallIntent.cancel();

1 Ответ

1 голос
/ 07 января 2012

Мне это кажется нормальным, однако вместо создания двух объектов календаря вы можете просто установить интервал на

AlarmManager.INTERVAL_DAY/2

, если ваши намерения не делают разные вещи.

Кроме того,

alarms.cancel(firstCallIntent);
alarms.cancel(secondCallIntent);

должно быть достаточно для отмены всех сигналов этих типов, нет необходимости:

firstCallIntent.cancel();

Редактировать: Установка 2 объектов календаря

//midday
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, 12);
cal1.set(Calendar.MINUTE, 00);
cal1.set(Calendar.SECOND, 00);

//7pm
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, 19);
cal2.set(Calendar.MINUTE, 00);
cal2.set(Calendar.SECOND, 00);

Calendar.getInstance () вернет объект календаря и установит для него текущее системное время.Каждый метод .set изменяет определенную переменную этого календарного объекта.Так что в настоящее время, если бы это было 8 вечера, он установил бы будильник на 12 и 7 в тот день, что было бы бесполезно.Поэтому, если вы хотите установить его на следующий день, вам нужно использовать cal1.add (Calendar.DAY_OF_MONTH, 01);добавить дополнительный день, установив для этого времени следующий день.Надеюсь, это поможет.

...