Android AlarmManager срабатывает слишком непредсказуемо с небольшими интервалами.Какой минимальный разумный интервал будет работать близко к ожидаемому времени? - PullRequest
0 голосов
/ 22 сентября 2018

Прежде всего мне известны другие вопросы по этому поводу, такие как: планирование будильника на каждую секунду в Android 5.1 или Как использовать Android AlarmManager с небольшими интервалами, например, 1 минута?

Таким образом, в основном говорится, что это поведение с небольшими интервалами является таким, как предполагалось, из-за оптимизации системы.А что мало?Речь шла о настройке будильника каждые несколько секунд.Но как насчет минут?Та же проблема?Какие интервалы начнут вести себя ближе к запланированному времени?Часы?Дни?И, похоже, они говорят об установке повторяющихся интервалов с помощью setRepeating .

Так вот с чем я борюсь.Я пытаюсь настроить сигналы тревоги каждые 5 минут (300000 миллисекунд). Это все еще слишком мало?И я пытаюсь сделать это через set или даже setExact или setWindow .После первого срабатывания тревоги я устанавливаю новый на 300000 мс.Вот как я настраивал изначально:

//initially somewhere I call:
IntervalScheduler.createAlarm(context!!, 300000)
...

//which is this:
object IntervalScheduler
{
    fun createAlarm(ctx: Context, milliseconds: Long)
    {
        val intent = Intent(ctx, AlarmReceiver::class.java)
        val alarmManager = ctx.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)
        if (Build.VERSION.SDK_INT >= KITKAT)
        {
            // doesn't help
            //alarmManager.setExact(AlarmManager.RTC_WAKEUP, milliseconds, 60000, pendingIntent)

            // this doesn't help as well - trying to give it a window of 1 minute
            alarmManager.setWindow(AlarmManager.RTC_WAKEUP, milliseconds, 60000, pendingIntent) // doesn't help
        }
        else
        {
            alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, pendingIntent)
        }
    }
}

// this gets called fine
class AlarmReceiver: BroadcastReceiver()
{
    override fun onReceive(context: Context?, intent: Intent?)
    {
        Log.i("NOTE","Notifying")
        // create next alarm
        IntervalScheduler.createAlarm(context!!, 300000)
    }
}

Вот итоговый журнал:

09-21 22:21:53.846 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:22:54.812 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:23:55.023 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:00.655 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:06.085 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:11.616 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:17.193 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:22.674 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:28.164 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:24:33.852 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:25:34.815 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:26:57.604 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:28:14.842 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:29:14.968 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:30:15.275 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:31:15.459 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:32:15.644 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:33:15.834 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:34:15.941 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:35:16.143 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:36:17.804 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:17.969 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:23.686 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:29.131 26982-26982/com.sykes I/NOTE: Notifying
09-21 22:37:34.749 26982-26982/com.sykes I/NOTE: Notifying

Это не где-то около 5 минут.На самом деле это редко больше минуты.Как и последние 4 звонка, произошедших за одну минуту.Система оптимизирует время от 5 минут до 6-5 секунд?

Это все так же, как и ожидалось?Будет ли это намного ближе к ожиданиям, если установить 3600000 (1 час) или 86400000 (24 часа)?

1 Ответ

0 голосов
/ 23 сентября 2018

Нашел, что я делаю не так.Я звонил set (и все другие варианты) с типом тревоги RTC_WAKEUP и передавал его 300000 (5 минут).Я не осознавал, что сигнал тревоги ожидает время срабатывания в миллисекундах.Я продолжал думать, что это было число миллисекунд, чтобы ждать с этого момента.Так что раньше это было:

alarmManager.set(AlarmManager.RTC_WAKEUP, milliseconds, pendingIntent)

и исправление было:

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + milliseconds, pendingIntent)

Имейте в виду.Это не значит, что у меня получалось хорошо работать на небольших интервалах.Я заставил это работать вообще - даже для больших интервалов.

PS.Я не знаю, полезно ли это для сохранения в стеке.

...