Android disabilita il timeout dello schermo mentre l'app è in esecuzione


Risposte:


173

Vuoi usare qualcosa del genere:

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

4
questo lo rende per l'attività di corsa o per l'intera app?
Muhammed Refaat

@ MayurR.Amipara sì, penso che questo sia il caso qui
Muhammed Refaat

1
Se scrivo questo codice nel metodo onCreate () della classe Application, funzionerà per l'intera app?
Jayesh

Se no, allora come posso mantenere lo schermo intero dell'app inserendo meno codice invece di aggiungere quella riga a ciascuna attività.
Jayesh

1
@ Jayesh: puoi creare una baseActivity e scrivere questo codice nel metodo onCreate ed estendere tutte le attività da baseActivity.
maryam

102

Ero solito:

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

per disabilitare il timeout dello schermo e

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

per riattivarlo.


84

C'è anche un modo XML che Google consiglia:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true">

Controlla Presentazioni Google - Diapositiva 16.

"I wakelock sono costosi se dimenticati (...) Considera l'utilizzo di android: keepScreenOn per garantire la correttezza"


2
Per quelli che non hanno tempo di leggere il pdf collegato: "I wakelock sono costosi se dimenticati", "Considera l'utilizzo di android: keepScreenOn per garantire la correttezza".
lenrok258

2
@ lenrok258 Aggiunto alla risposta ;-)
neteinstein

Durante l'utilizzo PowerManager.newWakeLocke getWindow().addFlagsnon ha funzionato per qualche motivo, questo ha funzionato.
Benjamin Basmaci


3

Aggiungi semplicemente la riga sotto nella tua MainActivitye la tua app non spegne mai le luci.

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

2

In una vista, nel mio caso una sottoclasse di SurfaceView, puoi impostare lo schermo sempre acceso. Volevo che lo schermo rimanesse acceso mentre questa vista disegnava ancora cose.

public class MyCoolSurfaceView extends SurfaceView { 
@Override
protected void onAttachedToWindow (){
    super.onAttachedToWindow();
    this.setKeepScreenOn(true);
}

@Override
protected void onDetachedFromWindow(){
    super.onDetachedFromWindow();
    this.setKeepScreenOn(false);
}

1
In realtà è più complicato del necessario. Basta chiamare setKeepsScreenOn (true) ovunque e il framework si prenderà automaticamente cura di mantenere lo schermo acceso quando viene mostrata la finestra.
hackbod

1

Mettilo su onStart

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "no sleep");
    wakeLock.acquire();

E questo a te lo manifesti

    <uses-permission android:name="android.permission.WAKE_LOCK" />

Non dimenticare di farlo

wakeLock.release();

a onStop


1
PARTIAL_WAKE_LOCKconsente allo schermo di spegnersi.
Michael

1

questo è il modo migliore per risolverlo

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

perché è necessario che FLAG_FULLSCREEN risponda a questa domanda?
Abdul Wasae


0
procedure SetSleep(aEnable:Boolean);
var
    vFlags: integer;
begin
    vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
        TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
        TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;

    if aEnable then
    begin
      CallInUIThread (   // uses FMX.Helpers.Android
      procedure
      begin
        TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
      end );
    end
    else
      CallInUIThread (
      procedure
      begin
        TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
      end );
end;

0

1.getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); è la soluzione migliore per Android nativo.
2. se vuoi fare con l'applicazione Android React, usa il codice sottostante.

@ReactMethod
    public void activate() {
        final Activity activity = getCurrentActivity();
        if (activity != null) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
        }

    }

-1

Questo può essere fatto acquisendo un Wake Lock.

Non l'ho testato da solo, ma ecco un piccolo tutorial su questo.


10
No no no. I Wake Lock possono essere facilmente utilizzati in modo improprio e possono scaricare la batteria dell'utente se non utilizzati con molta attenzione. Usa View#setKeepScreenOno il suo attributo di layout xml equivalente,android:keepScreenOn="true"
adamp

5
@adamp: L'OP non ha indicato se la sua app è un'attività o un servizio. Un'attività dovrebbe utilizzare il meccanismo che citi. Un servizio dovrebbe utilizzare un file WakeLock.
CommonsWare

grazie non è un servizio. è simile a un visualizzatore di immagini e non voglio che lo schermo venga oscurato.
morsetto

@adamp: la tua menzione android:keepScreenOn="true"è l'unica risposta valida per le attività secondo me. Stai lontano dai wakelock a meno che non sia assolutamente necessario.
pauluss86

Non solo attività, ma qualsiasi tipo di interfaccia utente che mostra una finestra. La risposta accettata di utilizzare il flag della finestra corrispondente è ugualmente valida.
adamp
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.