Wie verhindere ich, dass ein Android-Gerät programmgesteuert in den Ruhezustand wechselt?

155

Wie verhindere ich, dass ein Android-Gerät programmgesteuert in den Ruhezustand wechselt?

James
quelle

Antworten:

133

Eine Möglichkeit ist die Verwendung einer Wecksperre . Beispiel aus den Dokumenten:

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();

Auf dieser Seite gibt es auch eine Tabelle , in der die verschiedenen Arten von Wakelocks beschrieben werden.

Beachten Sie, dass bei der Verwendung von Weckschlössern Vorsicht geboten ist. Stellen Sie sicher, dass Sie immer release()die Sperre haben, wenn Sie damit fertig sind (oder nicht im Vordergrund). Andernfalls kann Ihre App möglicherweise zu einer ernsthaften Batterieentladung und CPU-Auslastung führen.

Die Dokumentation enthält auch eine nützliche Seite , auf der verschiedene Ansätze beschrieben werden, um ein Gerät wach zu halten und wann Sie eines verwenden möchten. Wenn sich "Verhindern, dass das Gerät in den Ruhezustand wechselt" nur auf den Bildschirm bezieht (und die CPU nicht aktiv hält), ist eine Wecksperre wahrscheinlich mehr als Sie benötigen.

Sie müssen auch sicherstellen, dass in Ihrem Manifest die Berechtigung WAKE_LOCK festgelegt ist, um diese Methode verwenden zu können.

Eldarerathis
quelle
21
Sie sollten dies nicht mehr verwenden, da diese Methode jetzt veraltet ist. Schauen Sie sich eine der anderen Antworten an.
DuKes0mE
4
Es gibt noch einige Gründe, Wakelocks zu verwenden, z. B. wenn das Gerät einer bestimmten App zugeordnet ist und auch bei Minimierung ausgeführt werden muss.
Muz
2
PowerManager.PARTIAL_WAKE_LOCK ist nicht veraltet und ich denke, es ist die effizienteste Methode. Der Benutzer kann den Netzschalter drücken, die CPU wird jedoch weiterhin eingeschaltet, bis der Benutzer die Freigabe () aufruft.
Mansour Fahad
In der offiziellen Dokumentation heißt es: "Wenn Sie die CPU laufen lassen müssen, um einige Arbeiten abzuschließen, bevor das Gerät in den Energiesparmodus wechselt, können Sie eine PowerManager-Systemdienstfunktion namens Wake Locks verwenden."
Joaquin Iurchuk
Das ist ein guter Weg, aber es ist veraltet. Bitte überprüfen Sie diese Antwort: stackoverflow.com/a/22447615/5327912
Parth Anjaria
239

Wenn Sie nur den Ruhemodus für einen bestimmten Modus verhindern möchten View, rufen Sie diesen einfach setKeepScreenOn(true)auf Viewoder setzen Sie die keepScreenOnEigenschaft auf true. Dadurch wird verhindert, dass der Bildschirm ausgeht, während Viewder Bildschirm angezeigt wird. Hierfür ist keine besondere Erlaubnis erforderlich.

Witek
quelle
18
Dies zwingt das Telefon auch nicht dazu, außerhalb der Lebensdauer der Anwendung wach zu bleiben. Sie können auf dieses Problem mit WakeLock stoßen.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Ja, in den meisten Fällen ist dies der bessere Ansatz.
Edward Falk
8
Dies sollte die ausgewählte Antwort sein. Einfach, sauber und wie von Android beabsichtigt. Danke dir.
Lior Iluz
2
"Verwenden von Android: keepScreenOn =" true "entspricht der Verwendung von FLAG_KEEP_SCREEN_ON. Sie können den für Ihre App am besten geeigneten Ansatz verwenden. Der Vorteil des programmgesteuerten Setzens des Flags in Ihrer Aktivität besteht darin, dass Sie das Flag später und später programmgesteuert löschen können Dadurch kann der Bildschirm ausgeschaltet werden "- developer.android.com/training/scheduling/wakelock.html
Antonino
Beachten Sie, dass dies setKeepScreenOn(true)nur wirksam wird, wenn Viewes sichtbar ist.
Jeff T.
121

Ich habe eine andere funktionierende Lösung gefunden: Fügen Sie Ihrer App unter dem Ereignis onCreate die folgende Zeile hinzu.

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

Mein Beispiel für ein Cordova-Projekt sieht folgendermaßen aus:

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");
    }
}

Danach ging meine App nicht mehr in den Ruhezustand, solange sie geöffnet war. Danke für die Antwort geht an xSus.

dogatonisch
quelle
Dies war meiner Meinung nach die beste Option ... +1
Amit
Dies entspricht der Witek-Antwort. Der einzige Unterschied besteht darin, dass Sie diese in eine ".java" -Datei anstatt in eine ".xml"
-Datei einfügen. ---)
Wie wäre es mit Erlaubnis? Ist eine Erlaubnis erforderlich?
Mehdi Khademloo
@ Mehdi Khademloo es braucht keine Erlaubnis.
Wessam El Mahdy
17

Setzen Sie die Flags im Fenster der Aktivität wie folgt

@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);
}
Arjun
quelle
6

Über die Root-Shell (z. B. ADB-Shell) können Sie sperren mit:

echo mylockname >/sys/power/wake_lock    

Danach bleibt das Gerät wach, bis Sie Folgendes tun:

echo mylockname >/sys/power/wake_unlock    

Mit der gleichen Zeichenfolge für 'mylockname'.

Beachten Sie, dass dies nicht verhindert, dass der Bildschirm schwarz wird, sondern dass die CPU nicht in den Ruhezustand wechselt.

Beachten Sie, dass / sys / power / wake_lock Lese- / Schreibzugriff für Benutzerradio (1001) und Gruppensystem (1000) und natürlich root ist.

Eine Referenz finden Sie hier: http://lwn.net/Articles/479841/

jelle foks
quelle
3

Was @eldarerathis gesagt hat, ist in jeder Hinsicht richtig. Die Wake-Sperre ist der richtige Weg, um das Gerät vom Einschlafen abzuhalten.

Ich weiß nicht, was Ihre App tun muss, aber es ist wirklich wichtig, dass Sie darüber nachdenken, wie Ihre App aufgebaut ist, damit Sie das Telefon nicht zwingen, für mehr, das Sie benötigen, wach zu bleiben, da sonst die Akkulaufzeit enorm leidet.

Ich möchte Sie zu diesem wirklich zeigen gutes Beispiel , wie man verwenden , AlarmManagerum Feuer Ereignisse und das Telefon und (App) aufwachen, um auszuführen , was Sie tun müssen , und dann schlafen gehen wieder: Alarm Manager (Quelle: commonsware.com)

Lucabox
quelle
Es gibt Utility-Apps, die speziell und gezielt zum Entladen des Akkus gedacht sind. Ich hatte einmal ein Bedürfnis. Grundsätzlich würde es Wakelocks erwerben, wie verrückt vibrieren, Taschenlampe einschalten, die Helligkeit erhöhen usw. Also ja, es gibt Apps, die dies nutzen. Aber das war
kein
0

Wenn Sie ein Xamarin-Benutzer sind, ist dies die Lösung:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
quelle