Заменить ACTION_SCREEN_ON на ACTION_USER_PRESENT?

У меня есть давно работающая служба, прослушивающая вход датчика. Для экономии заряда батареи я остановил выборку датчиков в ACTION_SCREEN_OFF и возобновил ее в ACTION_SCREEN_ON.

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

Поэтому я попытался заменить ACTION_SCREEN_ON на ACTION_USER_PRESENT в моем прослушивателе вещания. Это работало нормально, за исключением одного особого случая: когда экран гаснет, и я сразу нажимаю кнопку питания (или кнопку «Домой»), экран блокировки пропускается. И тогда ACTION_USER_PRESENT никогда не будет получен, только ACTION_SCREEN_ON.

Есть ли способ для моего широковещательного приемника после получения ACTION_SCREEN_ON узнать, активна ли блокировка экрана, и ожидать ACTION_USER_PRESENT позже? Или, если блокировка экрана пропущена, не ждать ACTION_USER_PRESENT, а сразу перезапустить выборку?


person Nicolai Buch-Andersen    schedule 18.09.2011    source источник


Ответы (2)


До Android 4.4, если экран включен и экран блокировки отключен, срабатывает только ACTION_SCREEN_ON. Начиная с Android 5.0, в этом случае запускаются как ACTION_SCREEN_ON, так и ACTION_USER_PRESENT.

person Max77    schedule 16.01.2016
comment
Любая ссылка на изменение поведения ACTION_USER_PRESENT? - person He Yifei 何一非; 04.08.2016

У меня есть давно работающая служба, прослушивающая вход датчика.

Имейте в виду, что пользователям не нравятся «долгоиграющие службы», и если вы не используете startForeground(), Android может закрыть вашу службу.

Я остановил выборку датчиков в ACTION_SCREEN_OFF и снова запустил ее в ACTION_SCREEN_ON.

Если вы не используете WakeLock, устройство все равно должно переходить в спящий режим, пока ваш прослушиватель датчиков зарегистрирован. Я не уверен, что вы получаете что-то от ACTION_SCREEN_OFF/ACTION_SCREEN_ON.

есть ли способ для меня широковещательный приемник после получения ACTION_SCREEN_ON узнать, активна ли блокировка экрана, и ожидать ACTION_USER_PRESENT позже?

Вы можете попробовать inKeyguardRestrictedInputMode() на KeyguardManager. Вроде должно работать, хотя я не пробовал.

person CommonsWare    schedule 18.09.2011
comment
Я мог бы поклясться, что в журнале говорилось, что он все еще работал, когда экран был выключен, но, возможно, я был неправ, или, может быть, я был слишком нетерпелив и не дал телефону время, чтобы полностью заснуть - я немного поэкспериментирую более. Тем временем я попробовал inKeyguardRestrictedInputMode(), но, к сожалению, это не сработало. Спасибо за ваш ответ! - person Nicolai Buch-Andersen; 20.09.2011
comment
На самом деле мой телефон никогда не уходит в спящий режим... На самом деле я продолжаю быстро разряжать батарею :)) - но опять же, у меня постоянно активное соединение работает в фоновом режиме - может быть, это не дает моему датчику спать?! - person Radu; 06.09.2012