Gerät aktiv halten

Damit sich der Akku nicht entlädt, schaltet ein Android-Gerät, das inaktiv bleibt, schnell in den Ruhemodus ein. Es gibt jedoch Situationen, in denen eine Anwendung den Bildschirm oder die CPU aktivieren und aktiv lassen muss, um bestimmte Aufgaben zu erledigen.

Der Ansatz, den Sie wählen, hängt von den Anforderungen Ihrer Anwendung ab. Als Faustregel gilt jedoch, dass Sie den einfachsten Ansatz für Ihre Anwendung verwenden sollten, um die Auswirkungen Ihrer Anwendung auf die Systemressourcen zu minimieren. In den folgenden Abschnitten wird beschrieben, wie Sie mit den Fällen umgehen, in denen das standardmäßige Schlafverhalten des Geräts nicht mit den Anforderungen Ihrer App kompatibel ist.

Alternativen zur Verwendung von Wakelocks

Bevor Sie Ihrer Anwendung Wakelock-Unterstützung hinzufügen, prüfen Sie, ob die Anwendungsfälle Ihrer Anwendung eine der folgenden alternativen Lösungen unterstützen:

  • Wenn Ihre App HTTP-Downloads mit langer Ausführungszeit ausführt, sollten Sie DownloadManager verwenden.

  • Wenn Ihre Anwendung Daten von einem externen Server synchronisiert, sollten Sie einen Synchronisierungsadapter erstellen.

  • Wenn Ihre Anwendung Hintergrunddienste benötigt, können Sie diese Dienste mit JobScheduler oder Firebase Cloud Messaging in bestimmten Intervallen auslösen.

  • Wenn Ihre Companion-App immer ausgeführt werden soll, wenn sich ein Companion-Gerät in Reichweite befindet, verwenden Sie den Companion-Gerätemanager.

Display eingeschaltet lassen

Bei bestimmten Apps wie Spielen oder Film-Apps muss der Bildschirm eingeschaltet bleiben. Am besten verwenden Sie FLAG_KEEP_SCREEN_ON in Ihrer Aktivität (und nur in einer Aktivität, nie in einem Dienst oder einer anderen App-Komponente). Beispiele:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

Der Vorteil dieses Ansatzes besteht darin, dass er im Gegensatz zu Wakelocks, die unter CPU eingeschaltet lassen erläutert wird, keine spezielle Berechtigung erfordert und dass die Plattform den Wechsel von Nutzern zwischen Anwendungen ordnungsgemäß verwaltet, ohne dass sich Ihre App um die Freigabe ungenutzter Ressourcen kümmern muss.

Sie können dies auch in der Layout-XML-Datei Ihrer Anwendung mithilfe des Attributs android:keepScreenOn implementieren:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

Die Verwendung 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 der programmatischen Einstellung des Flags in Ihrer Aktivität besteht darin, dass Sie das Flag später programmatisch löschen können, wodurch der Bildschirm ausgeschaltet wird.

Inaktivmodus für Fernseher

Auf Fernsehern sollte FLAG_KEEP_SCREEN_ON verwendet werden, um zu verhindern, dass das Gerät während der aktiven Videowiedergabe in den Inaktivmodus wechselt. Wenn FLAG_KEEP_SCREEN_ON nicht durch die Aktivität im Vordergrund festgelegt ist, wechselt das Gerät nach einer gewissen Zeit der Inaktivität automatisch in den Inaktivmodus.

CPU eingeschaltet lassen

Wenn die CPU weiter ausgeführt werden muss, um einige Vorgänge auszuführen, bevor das Gerät in den Ruhemodus wechselt, können Sie eine PowerManager-Systemdienstfunktion namens Wakelocks verwenden. Mit Wakelocks kann Ihre Anwendung den Energiestatus des Hostgeräts steuern.

Das Erstellen und Halten von Wakelocks kann erhebliche Auswirkungen auf die Akkulaufzeit des Hostgeräts haben. Daher sollten Sie Wakelocks nur verwenden, wenn es unbedingt erforderlich ist, und sie so kurz wie möglich halten. Beispielsweise sollten Sie keinen Wakelock in einer Aktivität verwenden müssen. Wie oben beschrieben, kannst du FLAG_KEEP_SCREEN_ON verwenden, wenn der Bildschirm während deiner Aktivität eingeschaltet bleiben soll.

Ein legitimer Fall für die Verwendung eines Wakelocks ist möglicherweise ein Hintergrunddienst, der einen Wakelock benötigt, um die CPU weiterlaufen zu lassen, während der Bildschirm ausgeschaltet ist. Diese Vorgehensweise sollte jedoch aufgrund ihrer Auswirkungen auf die Akkulaufzeit minimiert werden.

Wenn Sie einen Wakelock verwenden möchten, müssen Sie zuerst der Manifestdatei Ihrer App die Berechtigung WAKE_LOCK hinzufügen:

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

Wenn Ihre App einen Übertragungsempfänger enthält, der einen Dienst für seine Funktionen verwendet, können Sie einen Wakelock folgendermaßen direkt einrichten:

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

Rufen Sie wakelock.release() auf, um den Wakelock aufzuheben. Dadurch wird Ihr Anspruch auf die CPU zurückgezogen. Es ist wichtig, einen Wakelock sofort freizuschalten, wenn Ihre App ihn nicht mehr benötigt, um eine Entladung des Akkus zu vermeiden.