как проверить статус включения/выключения экрана в onStop()?

как упоминалось здесь, когда экран гаснет, будет вызываться onStop() текущего действия. Мне нужно проверить состояние включения / выключения экрана, когда вызывается onStop() моего Activity. поэтому я зарегистрировал BroadcastReceiver для этих действий (ACTION_SCREEN_ON И ACTION_SCREEN_OFF) для записи текущего состояния включения/выключения(и они работают правильно, я зарегистрировался!).
но когда я выключаю экран и проверяю включение/выключение статус в onStop, он говорит, что экран включен. Зачем? Я думаю, что получатель должен получить ACTION_SCREEN_OFF до вызова onStop, так что не так?


person Soheil    schedule 13.10.2013    source источник
comment
Я думаю, что получатель должен получить ACTION_SCREEN_OFF до вызова onStop, так что не так? -- Не понимаю, почему вы так решили. Используйте операторы Log или точки останова, чтобы увидеть, какие из них вызываются первыми. А еще лучше перепроектируйте свое приложение, чтобы не заботиться о том, вызывается ли onStop() из-за отключения экрана, по сравнению с любой другой причиной.   -  person CommonsWare    schedule 14.10.2013
comment
@CommonsWare приложение должно иметь возможность различаться между различными ситуациями, когда в них вызывается onStop, поэтому я должен знать, вызвало ли отключение экрана вызов onStop или что-то еще. любое лучшее решение?   -  person Soheil    schedule 14.10.2013
comment
приложение должно иметь возможность различаться между различными ситуациями, в которых вызывается onStop - почему? Какая разница для вашего приложения, выключен ли экран, или пользователь нажал ДОМОЙ, или пользователь нажал НАЗАД, или пользователь ответил на входящий телефонный звонок, или пользователь нажал на уведомление, или пользователь сделал что-то еще что привело к тому, что ваша активность больше не видна? Выключение экрана обычно не является особым случаем.   -  person CommonsWare    schedule 14.10.2013
comment
потому что я разрабатываю приложение для разблокировки, и все, что вызывает вызов onStop, должно обрабатываться в моем приложении, поэтому я пытаюсь определить любую ситуацию, в которой вызывается onStop, чтобы я мог различать нажатие кнопки «Домой» и другие. во всяком случае! вернемся к моему первому вопросу! у тебя есть идеи?   -  person Soheil    schedule 14.10.2013
comment
Что вы пытаетесь сделать в onStop, когда экран включен или выключен? Может быть, есть более простой или другой способ выполнить работу.   -  person jboi    schedule 14.10.2013
comment
@jboi Я упомянул об этом только в своем предыдущем комментарии выше!   -  person Soheil    schedule 14.10.2013


Ответы (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
comment
отлично Александр! BroadcastReceiver не получил действий в тот момент, когда я хотел, но это сделало :) - person Soheil; 14.10.2013
comment
pm.isScreenOn() устарел. - person Thomas Vos; 21.07.2015
comment
@SuperThomasLab Что использовать вместо этого? - person Ruchir Baronia; 25.11.2015
comment
Влияют ли такие вещи, как Samsung Always On Display, на функцию isInteractive()? - person Nathan F.; 13.02.2020
comment
@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
comment
Работает, но есть вопрос. Я использовал этот код внутри onStop(). Когда я выхожу из приложения (не убивая его полностью), оно возвращает true, как я и ожидал. Но когда я закрываю устройство, оно не возвращает false. Только если я верну приложение и закрою устройство, пока приложение находится на переднем плане, оно вернет false. Я хочу проверить статус, пока приложение находится в фоновом режиме. - person Abdulsamet Kılınçarslan; 07.02.2021
comment
@AbdulsametKılınçarslan Итак, этот код вызывается, когда вы отправляете приложение в фоновый режим. Но тогда, когда вы закрываете устройство, оно не вызывается? Я считаю, что если этот код находится в onStop(), то это потому, что onStop() будет вызываться только при уничтожении активности. Что произойдет только один раз. Возможно, вам придется сделать то, что делает OP этого поста, и вместо этого использовать широковещательный приемник для прослушивания событий отключения экрана. - person Rem-D; 08.02.2021

person    schedule
comment
что такое Utils.hasLollipop? как это лучше отвечает на вопрос? - person Jawad; 19.12.2019
comment
@Jaward public static boolean hasLollipop() { return Build.VERSION.SDK_INT >= 21; } isScreenOn() устарел, но isInteractive() не может быть ниже 21. - person Mary Seo; 19.12.2019