Диспетчер тревог не может вызвать тревогу, если дата добавлена ​​в календарь - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь создать сигналы тревоги в моем приложении с помощью AlarmManager.

Я могу установить несколько аварийных сигналов, но если параметр DATE добавлен в Calender, аварийные сигналы вообще не срабатывают. Ниже мой код

        Intent intent = new Intent(this, OneShotAlarm.class);
        /*Pass the task row ID as the Unique ID for Pending Intent*/
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), (int) rowid , intent, PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
        calendar.clear();
        calendar.setTimeInMillis(System.currentTimeMillis());

        calendar.set(Calendar.HOUR_OF_DAY, mHour);
        calendar.set(Calendar.MINUTE, mMinute);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        long timeSet = calendar.getTimeInMillis();
        alarmManager.set(AlarmManager.RTC_WAKEUP, timeSet, pendingIntent);

Если я добавлю параметры даты в календарь как

        calendar.add(Calendar.DAY_OF_MONTH, mDay);
        calendar.add(Calendar.MONTH, mMonth);
        calendar.add(Calendar.YEAR, mYear);

Сигналы тревоги не срабатывают. Я должен запланировать событие на будущее. Пожалуйста, предложите, что мне не хватает. Спасибо за помощь !!

P.S. Я беру дату и время из диалогового окна выбора даты и времени

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Я реализовал AlarmManager много раз, вам поможет следующая техника.

  1. рассчитайте время будильника в миллисекундах, например, если вы хотите установить будильник через 10 минут, а затем через 10 * 60 * 1000 миллисекунд после текущего времени.

  2. Добавьте расчетное время в миллисекундах

Пример

long currentTime = System.currentTimeMillis();
long fireTime = 10 * 60 * 1000;    
Intent ucintent = new Intent(getApplicationContext(),TimeAlarmReceiver.class);
ucintent.putExtra("isAlarm", true);

PendingIntent mTimeSlot = PendingIntent.getBroadcast(getApplicationContext(), (int)fireTime , ucintent, PendingIntent.FLAG_ONE_SHOT);
alarmManager.set(AlarmManager.RTC_WAKEUP,currentTime+ fireTime, mTimeSlot);

Приведенный выше пример отлично работает.

Спасибо,

0 голосов
/ 24 мая 2017

Ответ Кетана хорош, но есть ошибка.

    long currentTime = System.currentTimeMillis();
    long fireTime = 10 * 60 * 1000;    
    Intent ucintent = new Intent(getApplicationContext(),TimeAlarmReceiver.class);
    ucintent.putExtra("isAlarm", true);

    PendingIntent mTimeSlot = PendingIntent.getBroadcast(getApplicationContext(), (int) requestCode, ucintent, PendingIntent.FLAG_ONE_SHOT);
    alarmManager.set(AlarmManager.RTC_WAKEUP,currentTime+ fireTime, mTimeSlot);

Однако вы не хотите "fireTime" в PendingIntent. У вас должен быть код запроса. Какой код вы создаете для определения ваших ожидающих намерений. Это работает в случае Кетана, потому что он всегда использует одно и то же время. Но если вы измените время, у вас будут два разных намерения.

см. https://developer.android.com/reference/android/app/PendingIntent.html

...