Come posso impedire a un dispositivo Android di andare a dormire a livello di codice?


155

Come posso impedire a un dispositivo Android di andare a dormire a livello di codice?

Risposte:


133

Un'opzione è utilizzare un blocco scia . Esempio dai documenti:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

C'è anche una tabella in questa pagina che descrive i diversi tipi di wakelock.

Tenere presente che è necessario prestare attenzione quando si utilizzano i blocchi di attivazione. Assicurati di avere sempre release()il lucchetto quando hai finito (o meno in primo piano). Altrimenti la tua app potrebbe potenzialmente causare un serio consumo della batteria e l'utilizzo della CPU.

La documentazione contiene anche una pagina utile che descrive diversi approcci per mantenere sveglio un dispositivo e quando è possibile scegliere di utilizzarne uno. Se "impedisce al dispositivo di andare in modalità di sospensione" si riferisce solo allo schermo (e non mantiene attiva la CPU), probabilmente un blocco di riattivazione è più del necessario.

È inoltre necessario essere sicuri di disporre dell'autorizzazione WAKE_LOCK impostata nel manifest per utilizzare questo metodo.


21
Non dovresti più usarlo poiché questo metodo è ora obsoleto. Dai un'occhiata a una delle altre risposte.
DuKes0mE,

4
Ci sono ancora alcuni motivi per usare i wakelock, come se il dispositivo sia dedicato a un'app specifica e debba essere eseguito anche se ridotto a icona.
Muz,

2
PowerManager.PARTIAL_WAKE_LOCK non è obsoleto e penso che sia il metodo più efficiente. Permette all'utente di premere il pulsante di accensione ma la CPU rimane accesa fino al rilascio della chiamata dell'utente ();
Mansour Fahad,

La documentazione ufficiale dice "Se è necessario mantenere la CPU in esecuzione per completare un po 'di lavoro prima che il dispositivo vada in standby, è possibile utilizzare una funzione di servizio del sistema PowerManager chiamata wake lock."
Joaquin Iurchuk,

Questo è un ottimo modo, ma è deprecato. si prega di controllare questa risposta: stackoverflow.com/a/22447615/5327912
Parth Anjaria

240

Se si vuole solo evitare che la modalità di sospensione su una specifica View, basta chiamare setKeepScreenOn(true)su quel Viewo impostare la keepScreenOnproprietà true. Ciò impedirà allo schermo di spegnersi mentre Viewè sullo schermo. Nessun permesso speciale richiesto per questo.


18
Inoltre, ciò non forzerà il telefono a rimanere sveglio al di fuori della durata dell'applicazione. È possibile riscontrare questo problema con WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
Sì, nella maggior parte dei casi, questo è l'approccio migliore.
Edward Falk,

8
Questa dovrebbe essere la risposta selezionata. Semplice, pulito e come previsto da Android. Grazie.
Lior Iluz,

2
"Utilizzo di Android: keepScreenOn =" true "equivale all'utilizzo di FLAG_KEEP_SCREEN_ON. Puoi utilizzare il metodo migliore per la tua app. Il vantaggio di impostare il flag a livello di codice nella tua attività è che ti dà la possibilità di cancellare a livello di codice il flag in un secondo momento e permettendo così allo schermo di spegnersi "- developer.android.com/training/scheduling/wakelock.html
Antonino

Si noti che setKeepScreenOn(true)avrà effetto solo quando Viewè visibile.
Jeff T.

121

Ho trovato un'altra soluzione funzionante: aggiungere la seguente riga alla tua app nell'evento onCreate.

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

Il mio esempio di progetto Cordova è simile al seguente:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Dopodiché, la mia app non andrebbe a dormire mentre era aperta. Grazie per la risposta va a xSus.


questa è stata la migliore opzione secondo me ... +1
Entro il

Questo equivale alla risposta di Witek, l'unica differenza è che lo metti in un file ".java" anziché in uno ".xml" ;-)
tiktak,

Che ne dici del permesso? È necessaria l'autorizzazione?
Mehdi Khademloo,

@Mehdi Khademloo non ha bisogno di autorizzazione.
Wessam El Mahdy,


17

Impostare i flag nella finestra delle attività come di seguito

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

6

Dalla shell di root (ad esempio shell adb), puoi bloccare con:

echo mylockname >/sys/power/wake_lock    

Dopo di che il dispositivo rimarrà sveglio, fino a quando non lo fai:

echo mylockname >/sys/power/wake_unlock    

Con la stessa stringa per "mylockname".

Nota che ciò non impedirà allo schermo di diventare nero, ma impedirà alla CPU di dormire.

Nota che / sys / power / wake_lock è read-write per la radio utente (1001) e il sistema di gruppo (1000) e, naturalmente, root.

Un riferimento è qui: http://lwn.net/Articles/479841/


3

ciò che @eldarerathis ha affermato è corretto sotto tutti gli aspetti, il blocco della sveglia è il modo giusto per impedire al dispositivo di andare a dormire.

Non so che cosa debba fare la tua app, ma è davvero importante pensare a come architetta la tua app in modo da non forzare il telefono a rimanere sveglio per più di quello che ti serve, o la durata della batteria ne risentirà enormemente.

Vorrei indicarti questo ottimo esempio su come utilizzare AlarmManagergli eventi per attivare e riattivare il telefono e (la tua app) per eseguire ciò che devi fare e poi tornare a dormire: Alarm Manager (fonte: commonsware.com)


Esistono app di utilità appositamente e appositamente progettate per scaricare la batteria. Ne avevo bisogno per una volta. Fondamentalmente acquisisce wakelock, vibra come un matto, accende la torcia, aumenta la luminosità, ecc. Quindi sì, ci sono app che ne fanno uso. Ma questo era fuori tema quindi perdonami
TheRealChx101,

0

Se sei un utente Xamarin, questa è la soluzione:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
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.