как упоминалось здесь, когда экран гаснет, будет вызываться onStop()
текущего действия. Мне нужно проверить состояние включения / выключения экрана, когда вызывается onStop()
моего Activity
. поэтому я зарегистрировал BroadcastReceiver
для этих действий (ACTION_SCREEN_ON
И ACTION_SCREEN_OFF
) для записи текущего состояния включения/выключения(и они работают правильно, я зарегистрировался!).
но когда я выключаю экран и проверяю включение/выключение статус в onStop
, он говорит, что экран включен. Зачем? Я думаю, что получатель должен получить ACTION_SCREEN_OFF
до вызова onStop
, так что не так?
как проверить статус включения/выключения экрана в onStop()?
Ответы (3)
Вы можете попробовать использовать для этой цели системный сервис PowerManager, вот пример и официальная документация (обратите внимание, что этот метод был добавлен на уровне API 7):
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
РЕДАКТИРОВАТЬ:
Метод isScreenOn() устарел на уровне API 21. Вместо этого вы должны использовать isInteractive:
boolean isScreenOn = pm.isInteractive();
http://developer.android.com/reference/android/os/PowerManager.html#isInteractive()
person
Alexander Semenov
schedule
13.10.2013
отлично Александр!
BroadcastReceiver
не получил действий в тот момент, когда я хотел, но это сделало :)
- person Soheil; 14.10.2013
pm.isScreenOn()
устарел.
- person Thomas Vos; 21.07.2015
@SuperThomasLab Что использовать вместо этого?
- person Ruchir Baronia; 25.11.2015
Влияют ли такие вещи, как Samsung Always On Display, на функцию
isInteractive()
?
- person Nathan F.; 13.02.2020
@RuchirBaronia понял это: stackoverflow.com/a/60218008/1720829
- person Nathan F.; 14.02.2020
Как упоминалось в этом ответе на аналогичный вопрос. В API 21 и выше мы можем использовать DisplayManager
для определения состояния дисплея. Преимущество этого заключается в поддержке запроса нескольких дисплеев:
DisplayManager dm = (DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
if (display.getState() != Display.STATE_OFF) {
return true;
}
}
return false;
В зависимости от ваших обстоятельств может быть более подходящим запросить дисплей, на котором отображается конкретное представление:
myView.getDisplay().getState() != Display.STATE_OFF
person
Rem-D
schedule
07.01.2020
Работает, но есть вопрос. Я использовал этот код внутри onStop(). Когда я выхожу из приложения (не убивая его полностью), оно возвращает true, как я и ожидал. Но когда я закрываю устройство, оно не возвращает false. Только если я верну приложение и закрою устройство, пока приложение находится на переднем плане, оно вернет false. Я хочу проверить статус, пока приложение находится в фоновом режиме.
- person Abdulsamet Kılınçarslan; 07.02.2021
@AbdulsametKılınçarslan Итак, этот код вызывается, когда вы отправляете приложение в фоновый режим. Но тогда, когда вы закрываете устройство, оно не вызывается? Я считаю, что если этот код находится в onStop(), то это потому, что onStop() будет вызываться только при уничтожении активности. Что произойдет только один раз. Возможно, вам придется сделать то, что делает OP этого поста, и вместо этого использовать широковещательный приемник для прослушивания событий отключения экрана.
- person Rem-D; 08.02.2021
person
schedule
что такое Utils.hasLollipop? как это лучше отвечает на вопрос?
- person Jawad; 19.12.2019
@Jaward
public static boolean hasLollipop() { return Build.VERSION.SDK_INT >= 21; }
isScreenOn() устарел, но isInteractive() не может быть ниже 21.
- person Mary Seo; 19.12.2019
Log
или точки останова, чтобы увидеть, какие из них вызываются первыми. А еще лучше перепроектируйте свое приложение, чтобы не заботиться о том, вызывается лиonStop()
из-за отключения экрана, по сравнению с любой другой причиной. - person CommonsWare   schedule 14.10.2013onStop
, поэтому я должен знать, вызвало ли отключение экрана вызовonStop
или что-то еще. любое лучшее решение? - person Soheil   schedule 14.10.2013onStop
, должно обрабатываться в моем приложении, поэтому я пытаюсь определить любую ситуацию, в которой вызываетсяonStop
, чтобы я мог различать нажатие кнопки «Домой» и другие. во всяком случае! вернемся к моему первому вопросу! у тебя есть идеи? - person Soheil   schedule 14.10.2013onStop
, когда экран включен или выключен? Может быть, есть более простой или другой способ выполнить работу. - person jboi   schedule 14.10.2013