Подтвердить что ты не робот

Будет ли обработчик postDelayed не запускаться, когда процессор спит?

У меня есть активность с некоторыми Handlers, которые выполняются с интервалами не более 5 минут. Активность запускается с BroadcastReceiver и может запускаться с выключенным экраном, ожидая, когда пользователь возьмет телефон и получит вход пользователя, когда это произойдет, активность onPause() вызывается так, что процессор находится в спящем режиме, Я не установил активность, чтобы включить экран, потому что я хочу сохранить как можно больше батареи.

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

Теперь я читал везде, что некоторые устройства работают не так, как ожидалось, когда экран отключается, а процессор спит, в большинстве случаев - с акселерометрами. Теперь мой вопрос: мне нужно получить WakeLock, чтобы процессор не спал, пока моя активность открыта? Я действительно хочу это знать, потому что, как я уже говорил, я не хочу "тратить" батарею, приобретая дорогой WakeLock.

Я бы предпочел подробный ответ человека, который действительно знает, как это работает.

4b9b3361

Ответ 1

Ваша цель не может быть стабильно достигнута вашим подходом. Если вы используете метод Handler postDelayed(), и процессор переходит в глубокий режим, счетчик ms остановится и будет продолжаться, только если процессор снова проснется.

Посмотрите это более подробно.

Итак, если вы хотите иметь какое-то задание cron, вам нужно будет использовать wakelock. К счастью, есть реализация Service, которая делает именно это: Wakeful IntentService

Из документа:

Рекомендуемый шаблон для Android, эквивалентный заданию cron и запланированным задачам Windows, - использовать AlarmManager. Это хорошо работает в сочетании с IntentService, поскольку служба будет выполнять свою работу в фоновом потоке и отключиться, когда больше не будет работы. Там одна небольшая проблема: IntentService ничего не делает, чтобы устройство не спало. Если сигнал тревоги был вариантом WAKEUP, телефон будет бодрствовать сам по себе, а BroadcastReceiver, обрабатывающий сигнал тревоги, находится в методе onReceive(). В противном случае телефон может засыпать. WakefulIntentService пытается бороться с этим, объединяя легкость IntentService с частичным WakeLock.