Forçar tela ligada


Respostas:


339

POR FAVOR, NÃO USE UM WAKE LOCK

Isso requer que você dê ao seu aplicativo uma permissão adicional, e é muito fácil introduzir bugs nos quais você acidentalmente permanece segurando o wake lock e, portanto, deixa a tela ligada.

É muito, muito melhor usar o sinalizador de janela FLAG_KEEP_SCREEN_ON, que você pode habilitar na janela de sua atividade da onCreate()seguinte maneira:

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

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

Isso garantirá que a tela permaneça ligada enquanto a janela estiver em primeiro plano e apenas enquanto estiver em primeiro plano. Isso simplifica muito esse caso de uso comum, eliminando qualquer malabarismo necessário para fazer as transições do aplicativo entre os estados.


5
Isso evita que o dispositivo hiberne? Nesse caso, a banalidade de WAKE_LOCK me parece um erro chocante!
Michael Cramer

32
Sim, mantém a tela ligada e evita que o dispositivo hiberne.
hackbod

1
Sim, você pode remover o sinalizador, com a API de janela apropriada. Você não precisa se preocupar em fazer com que nada seja desenhado, a estrutura faz isso, se necessário.
hackbod de

1
@hakbod: isso funcionaria para manter a tela viva, mas e a tela que está adormecida, ela acordaria e manteria viva ??
Kavitha

5
@ KC202 você pode usar WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON para fazer com que a tela ligue quando sua janela for exibida. Também é frequentemente usado com FLAG_DISMISS_KEYGUARD e / ou FLAG_SHOW_WHEN_LOCKED.
hackbod

34

Esta pergunta já tem uma ótima resposta por @hackbod!

Estou respondendo a esta pergunta com duas soluções adicionais!

Solução existente:

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

Soluções Adicionais:

podemos usar keepScreenOn

1. implementation usandosetKeepScreenOn() 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);
       }

Documentos http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2. Adicionando keepScreenOnaxml 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" >

Documentos http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn

Nota (alguns pontos úteis):

1. Não importa o que keepScreenOndeve ser usado Main/Root/Parent View , pode ser usado com qualquer child viewfuncionará Assim como funciona emParent view

2. A única coisa que importa é que de View's Visibility must be visibleoutro modo não funcionará!


nota v.setKeepScreenOn(true);parece ser a única maneira de fazer isso para um fragmento de diálogo em tela cheia
Tim

16

Outra solução é adicionar android:keepScreenOn="true"( documentação ) às visualizações que precisam para manter a tela ligada.

Permite um controle um pouco mais granular em termos de quais visualizações permanecem ativadas e quais não. Você pode até mesmo fazer referência a uma configuração de um arquivo de recurso dessa maneira.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.