AlarmManager сработает не в то время - PullRequest
0 голосов
/ 22 мая 2018

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

Установка будильника:

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 18); // trigger at 6 PM

        Intent notifyIntent = new Intent(context, CheckupAlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast
                (context, 100, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        android.app.AlarmManager alarmManager = (android.app.AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (alarmManager != null) {
            alarmManager.setInexactRepeating(android.app.AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    android.app.AlarmManager.INTERVAL_DAY, pendingIntent);
        }

Манифест:

<receiver
      android:name=".notifications.CheckupAlarmReceiver"
      android:enabled="true"
      android:exported="false" />

Чтобы повторить, будильник работает нормально.Это просто срабатывает в неподходящее время.Экземпляр календаря не учитывает часовой пояс?Что я тут не так делаю?

1 Ответ

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

Вы устанавливаете setInexactRepeating(), который, как следует из его названия, не может быть запущен в указанное вами время.Это оптимизация, поэтому операционная система пытается получить более одного аварийного сигнала, который должен сработать в одинаковое время для одновременного срабатывания всех из них.

Вместо этого вы можете использовать void setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation).См. документацию .

Пример:

 alarmManager.setExactAndAllowWhileIdle(android.app.AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

В соответствии с рекомендациями, не следует использовать повторяющийся сигнал тревоги с точным временем.Вместо этого вы можете подождать, пока не сработает точный сигнал, а затем запланировать еще один сигнал на следующий день.

Для API ниже 23 вы можете использовать void setExact(int type, long triggerAtMillis, PendingIntent operation).А для API ниже 19 вы можете использовать void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) с ожидаемым точным срабатыванием, как всегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...