Как составить список запланированного времени в диспетчере аварий для отправки уведомлений - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить список времени, сохраненного в Sqlite (в нем есть часы и минуты), в диспетчер сигналов тревоги, чтобы выполнить напоминание через уведомление. Мой подход состоял в том, чтобы зациклить все запланированное время, сохраненное в Sqlite, в диспетчере аварийных сигналов для выполнения уведомлений на основе списка сохраненного времени, но уведомление не издает звуковых сигналов.

Но когда я указываю один раз (час и минуту), это работает. Ниже приведен пример кода, который работает, но я не хочу этого:

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 45);
Intent myIntent = new Intent(ListRemainder.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(ListRemainder.this, 0, myIntent, 0);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

Но когда дело доходит до цикла нескольких временных графиков, это не работает, и это тот подход, который мне нужен, ниже приведен пример кода, что мне не хватает?

//listOfTime is the one which contains the list of stored scheduled time in Sqlite.
for (int i = 0; i < listOfTime.size(); i++) {
    int hour = Integer.parseInt(listOfTime.get(i).toString().substring(0, 2));
    int minute = Integer.parseInt(listOfTime.get(i).toString().substring(3));
    System.out.print("Hour : " + hour + " Minute : " + minute);
    Log.d("MyActivity", "Alarm On");
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    Intent myIntent = new Intent(ListRemainder.this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(ListRemainder.this, 0, myIntent, 0);
    alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}

1 Ответ

0 голосов
/ 09 мая 2018

Прототип для getBroadcast выглядит так:

getBroadcast(Context context, int requestCode, Intent intent, int flags)

Установка уникального 'requestCode' для каждого PendingIntent должна позволять планировать несколько аварий:

PendingIntent.getBroadcast(context, uniqueValue, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Для гарантированного пробуждения при критических тревогах пользователя:

void setAlarmClock (AlarmManager.AlarmClockInfo info, 
            PendingIntent operation)

Из документов: «Запланируйте будильник, представляющий будильник, который будет использоваться для уведомления пользователя о его срабатывании. Ожидается, что при срабатывании этого будильника приложение дополнительно разбудит устройство, чтобы сообщить пользователю о включении будильника». на экране, воспроизводя звук, вибрируя и т. д. Таким образом, система, как правило, будет также использовать предоставленную здесь информацию, чтобы сообщить пользователю об этой предстоящей тревоге, если это необходимо.

В связи с характером этого типа аварийного сигнала, аналогичного setExactAndAllowWhileIdle (int, long, PendingIntent), эти аварийные сигналы будут разрешаться, даже если система находится в режиме ожидания с низким энергопотреблением (также известном как доза). "

Подведем итог:

  • Используйте setAlarmClock, чтобы активировать устройство для представления информации пользователю.
  • Используйте setExactAndAllowWhileIdle для выполнения работы в фоновом режиме, которая должна выполняться во время сна. Однако срабатывание этих аварийных сигналов может быть связано с задержками примерно от 1 минуты до 15 минут.
  • Используйте FCM для пробуждения устройства в режиме реального времени из удаленного приложения. На практике многие приложения должны использовать FCM вместо setExactAndAllowWhileIdle, если это возможно.
  • Используйте setExact, если точная синхронизация во время дозирования не важна. Кроме того, используйте setExact на устройствах до API 21 вместо setAlarmClock или setExactAndAllowWhileIdle ...

Окончательное решение Лутаайи:

AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(),pendingIntent), pendingIntent);
...