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

Пишу свою первую программу-будильник. Программа устанавливает повторяющийся сигнал тревоги, который должен срабатывать каждые 200 мс. Но дело в том, что вместо этого интервал почти 40 секунд!! И кажется, что какой бы интервал времени я ни установил, это не имеет большого значения. Так что на самом деле кажется, что после API 19 нет способа заставить setRepeating() сигнал тревоги срабатывать чаще, чем ~ 40 секунд, верно? Вот фрагмент кода:

if(alarmRepetition.equalsIgnoreCase(context.getString(R.string.alarm_once))){
      Intent backIntent = new Intent("Time to delete an Alarm kva-kva");
      backIntent.putExtra("Time to delete", alarmId);
      Calendar calendarNow = Calendar.getInstance();
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmId, backIntent, 0);
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      alarmManager.setRepeating(AlarmManager.RTC, calendarNow.getTimeInMillis(), 200, pendingIntent);
}

person StanislavOssovsky    schedule 24.03.2021    source источник
comment
Отвечает ли это на ваш вопрос? Есть ли точная система повторяющихся сигналов тревоги для Android?   -  person Andre Classen    schedule 25.03.2021
comment
Повторяющийся сигнал тревоги каждые 200 мс выглядит как злоупотребление системными ресурсами. Это игрушечный пример для тестирования, или вы действительно пытаетесь что-то делать каждые 200 мс? Если это так, то AlarmManager почти наверняка не тот инструмент. Вероятно, вам нужна служба переднего плана, которая просто запускает что-то каждые 200 мс в процессе или что-то в этом роде.   -  person Ryan M    schedule 25.03.2021
comment
Привет Райан! Конечно это игрушечный пример! Мне определенно не понадобится будильник каждые 200 мс в любой реальной ситуации.   -  person StanislavOssovsky    schedule 25.03.2021
comment
Привет Андре. Я знаю, что есть несколько вариантов. Но чего я не могу понять, так это зачем вообще нужен третий параметр в функции setRepeating(), если он на самом деле ничего не значит. Независимо от того, устанавливаю ли я его на 5 секунд или доли секунды, сигнал тревоги все равно повторяется минимум через 40 секунд.   -  person StanislavOssovsky    schedule 25.03.2021


Ответы (1)


Согласно документы

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

AlarmManager попытается запланировать будильники вместе, чтобы сэкономить заряд батареи.

person tyczj    schedule 24.03.2021
comment
Означает ли это, что третий параметр в функции setRepeating() будет играть какую-либо роль только тогда, когда он на самом деле >40000 мс? (потому что в среднем кажется, что тревоги повторно запускаются каждые минимум 40 секунд). Странно... Если есть такие ограничения, почему API до сих пор допускает гораздо меньшие значения?.. Так что нет возможности заставить повторяющийся сигнал тревоги повторяться чаще, начиная с API 19? - person StanislavOssovsky; 25.03.2021
comment
В вашем примере маловероятно, что он когда-либо сработает вовремя из-за чрезвычайно короткого окна между сигналами тревоги, но если бы у вас был, скажем, один час, вы могли бы иногда увидеть, что он срабатывает вовремя. IIRC есть 15-минутное окно с момента запуска, в течение которого он может сработать. Почему третий параметр допускает такие маленькие значения? Для обратной совместимости. Чтобы иметь возможность создать сигнал тревоги, который срабатывает именно тогда, когда вы этого хотите, вы должны делать то, что говорят документы, и использовать setExact, когда он срабатывает, вы затем создаете другой сигнал тревоги с помощью setExact, и теперь у вас есть повторяющийся сигнал тревоги. - person tyczj; 25.03.2021
comment
Понятно! Спасибо! - person StanislavOssovsky; 25.03.2021