Каково определение спящего режима для устройства Android?

Я использую

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 0, DURATION, broadcast);

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

Теперь, когда устройство Android спит? Для тестирования я установил продолжительность до двух минут и подключил устройство к моей машине. Теперь я смотрю logcat, и каждые две минуты он выплескивает мое сообщение об отладке.

Я всегда думал, что дезактивированный экран означает, что устройства начинают спать. Или я смотрю на вывод отладки, препятствующий спятию устройства? Я также отключил USB-соединение и просмотрел журнал через полчаса, и я мог видеть вызов моего таймера, даже если дисплей был темным более 15 минут.

Как я могу проверить, с какого времени команда больше не выполняется, а что спящий - в документации AlarmManager? Есть ли способ увидеть из вывода logcat, когда устройство засыпало?

Ответ 1

Устройство спит, когда не работает приложение, которое мешает ему спать. Так: 1. Экран выключен (в то время как на нем всегда есть какое-то запущенное приложение, например Launcher) 2. Отсутствует работающий сервис (например, музыка, загрузка) - нет блокировок ЦП.

AlarmManager просыпается от сна, запускает то, что нужно запустить. Это важно, например. для завершения службы, которая была создана в широковещательном приемнике от тревоги, чтобы устройство снова заснуло. Если вы делаете больше и важнее в фоновом режиме, вы должны приобрести блокировку процессора для своего приложения, чтобы предотвратить его урон от ОС Android.

Что именно вы подразумеваете под "Как проверить, с какого времени команда больше не выполняется"? Какая команда?

Из JavaDoc:

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

Таким образом, ОС удерживает все сигналы тревоги, устройство может быть пробуждено сигналом тревоги, который идет во время сна. После перезагрузки будильники удаляются (вы должны хранить их в БД и восстанавливать после перезагрузки).

"Есть ли способ увидеть из вывода logcat, когда устройство начинает спать?" Поскольку я знаю, что нет, я могу видеть только это, когда экран выключается:

*** set_screen_state 0 из тега "power"

ИМХО, вы не должны беспокоиться о спящем режиме, просто сделайте свое приложение "хорошим гражданином Android", если нужно, выключите и заработайте экран (Intent.ACTION_SCREEN_OFF), завершая службы ASAP, освобождая ресурсы (сеть, GPS, CPU) КАК МОЖНО СКОРЕЕ, используя неточные сигналы тревоги, менеджер загрузки и весь хороший персонал, приведённый ОС. Я считаю, что Android обрабатывает процессор спящим прозрачно.

Ответ 2

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

В зависимости от версии Android на вашем устройстве вы можете найти график своего пробуждения в настройках → О телефоне → Использование батареи → Затем нажмите на верхнюю часть графика. Более подробную информацию о блокировках слежения можно найти на http://developer.android.com/reference/android/os/PowerManager.html