Принудительное включение экрана

Ответы:

339

ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ WAKE LOCK

Это требует, чтобы вы дали своему приложению дополнительное разрешение, и очень легко ввести ошибки, когда вы случайно удерживаете блокировку пробуждения и, таким образом, оставляете экран включенным.

Намного, намного лучше использовать флаг окна FLAG_KEEP_SCREEN_ON, который вы можете включить в окне своей активности onCreate()следующим образом:

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

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

hackbod
источник
5
Это мешает устройству спать? Если это так, то распространенность WAKE_LOCK кажется мне шокирующей ошибкой!
Майкл Крамер
32
Да, экран остается включенным и не дает устройству спать.
hackbod
1
Да, вы можете удалить флаг с помощью соответствующего API окна. Вам не нужно беспокоиться о том, чтобы что-либо было нарисовано, фреймворк сделает это при необходимости.
hackbod
1
@hakbod: это сработает для сохранения экрана живым, но как насчет экрана, который спит, разбудит ли он его и сохранит ли ????
Kavitha
5
@ KC202 вы можете использовать WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, чтобы экран включался при отображении вашего окна. Также часто используется с FLAG_DISMISS_KEYGUARD и / или FLAG_SHOW_WHEN_LOCKED.
hackbod
34

На этот вопрос уже есть отличный ответ от @hackbod!

Я отвечаю на этот вопрос двумя дополнительными решениями!

Существующее решение:

@Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

Дополнительные решения:

мы можем использовать keepScreenOn

1. implementation используяsetKeepScreenOn() in java code

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // or any View (in case generated programmatically ) 
        View v = getLayoutInflater().inflate(R.layout.driver_home, null);

        v.setKeepScreenOn(true);
        setContentView(v);
       }

Документы http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2. Добавление keepScreenOnкxml layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true" >

Документы http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn

Примечание (некоторые полезные моменты):

1. Неважно, что keepScreenOnследует использовать на Main/Root/Parent View нем можно использовать с любым child viewбудет работать так же, как он работает вParent view

2. Дело только в том, что по- View's Visibility must be visibleдругому не получится!

Тарсем Сингх
источник
Примечание - v.setKeepScreenOn(true);кажется, единственный способ сделать это для полноэкранного диалогового фрагмента
Тим
16

Другое решение - добавить android:keepScreenOn="true"( документацию ) к представлениям, которые должны держать экран включенным.

Позволяет немного более детально контролировать, какие просмотры остаются, а какие нет. Таким образом вы даже можете ссылаться на настройку из файла ресурсов.

Александр Абрамов
источник