Будет ли обработчик postDelayed не запускаться, когда процессор спит?
У меня есть активность с некоторыми Handlers
, которые выполняются с интервалами не более 5 минут. Активность запускается с BroadcastReceiver
и может запускаться с выключенным экраном, ожидая, когда пользователь возьмет телефон и получит вход пользователя, когда это произойдет, активность onPause()
вызывается так, что процессор находится в спящем режиме, Я не установил активность, чтобы включить экран, потому что я хочу сохранить как можно больше батареи.
Я тестировал его с помощью своего телефона и работал очень хорошо, а экран отключен от всех Handlers
выполняет весь код, который им нужно выполнить. Если я включаю и выключаю экран во время открытой активности, все работает нормально.
Теперь я читал везде, что некоторые устройства работают не так, как ожидалось, когда экран отключается, а процессор спит, в большинстве случаев - с акселерометрами. Теперь мой вопрос: мне нужно получить WakeLock
, чтобы процессор не спал, пока моя активность открыта? Я действительно хочу это знать, потому что, как я уже говорил, я не хочу "тратить" батарею, приобретая дорогой WakeLock
.
Я бы предпочел подробный ответ человека, который действительно знает, как это работает.
Ответы
Ответ 1
Ваша цель не может быть стабильно достигнута вашим подходом. Если вы используете метод Handler postDelayed()
, и процессор переходит в глубокий режим, счетчик ms остановится и будет продолжаться, только если процессор снова проснется.
Посмотрите это более подробно.
Итак, если вы хотите иметь какое-то задание cron, вам нужно будет использовать wakelock.
К счастью, есть реализация Service, которая делает именно это: Wakeful IntentService
Из документа:
Рекомендуемый шаблон для Android, эквивалентный заданию cron и запланированным задачам Windows, - использовать AlarmManager. Это хорошо работает в сочетании с IntentService, поскольку служба будет выполнять свою работу в фоновом потоке и отключиться, когда больше не будет работы. Там одна небольшая проблема: IntentService ничего не делает, чтобы устройство не спало. Если сигнал тревоги был вариантом WAKEUP, телефон будет бодрствовать сам по себе, а BroadcastReceiver, обрабатывающий сигнал тревоги, находится в методе onReceive(). В противном случае телефон может засыпать. WakefulIntentService пытается бороться с этим, объединяя легкость IntentService с частичным WakeLock.