Forza lo schermo


Risposte:


339

SI PREGA DI NON UTILIZZARE UN BLOCCO DI SVEGLIA

Ciò richiede che tu dia alla tua app un'autorizzazione aggiuntiva ed è molto facile introdurre bug in cui rimani accidentalmente tenendo premuto il wakelock e quindi lasci lo schermo acceso.

È molto, molto meglio usare il flag della finestra FLAG_KEEP_SCREEN_ON, che puoi abilitare nella finestra della tua attività in onCreate()questo modo:

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

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

Ciò assicurerà che lo schermo rimanga acceso mentre la finestra è in primo piano e solo mentre è in primo piano. Semplifica notevolmente questo caso d'uso comune, eliminando qualsiasi giocoleria che devi fare mentre la tua app passa da uno stato all'altro.


5
Ciò impedisce al dispositivo di dormire? Se è così, la banalità di WAKE_LOCK mi sembra un errore scioccante!
Michael Cramer

32
Sì, mantiene lo schermo acceso e impedisce al dispositivo di dormire.
hackbod

1
Sì, puoi rimuovere il flag, con l'apposita API della finestra. Non devi preoccuparti di causare il disegno di qualcosa, il framework lo fa se necessario.
hackbod

1
@hakbod: questo funzionerebbe per mantenere vivo lo schermo, ma per quanto riguarda lo schermo che è addormentato, lo sveglia e lo manterrebbe in vita ????
Kavitha

5
@ KC202 puoi usare WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON per far accendere lo schermo quando viene visualizzata la finestra. Spesso utilizzato anche con FLAG_DISMISS_KEYGUARD e / o FLAG_SHOW_WHEN_LOCKED.
hackbod

34

Questa domanda ha già un'ottima risposta da @hackbod!

Sto rispondendo a questa domanda con due soluzioni aggiuntive!

Soluzione esistente:

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

Soluzioni aggiuntive:

possiamo usare keepScreenOn

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

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

2. Aggiunta 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" >

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

Nota (alcuni punti utili):

1. Non importa che keepScreenOndovrebbe essere usato su di Main/Root/Parent View esso può essere usato con qualsiasi child viewfunzionerà come funzionaParent view

2. L'unica cosa importante è che View's Visibility must be visiblealtrimenti non funzionerà!


nota v.setKeepScreenOn(true);sembra essere l'unico modo per farlo per un frammento di dialogo a schermo intero
Tim

16

Un'altra soluzione è aggiungere android:keepScreenOn="true"( documentazione ) alle viste che devono mantenere lo schermo.

Consente un controllo un po 'più granulare in termini di quali visualizzazioni rimangono e quali no. Puoi persino fare riferimento a un'impostazione da un file di risorse in questo modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.