Fehlerbehebung bei Diensten im Vordergrund

Auf dieser Seite werden einige häufige Gründe für Fehler bei Diensten im Vordergrund erläutert und Sie erfahren, wie Sie die Ursache des Problems ermitteln können.

In diesem Dokument werden die folgenden Probleme behandelt:

Vor der Fehlerbehebung

Auf aktuelle Änderungen an Diensten im Vordergrund prüfen

Wenn Dienste im Vordergrund nicht ordnungsgemäß verwendet werden, kann sich dies negativ auf die Geräteleistung und die Akkulaufzeit auswirken. Aus diesem Grund werden in Android-Plattformversionen häufig Änderungen am Verhalten von Diensten im Vordergrund vorgenommen, um diese negativen Auswirkungen zu begrenzen.

Wenn Sie Probleme mit Diensten im Vordergrund haben, sollten Sie die Dokumentation zu Änderungen an Diensten im Vordergrund prüfen und nach aktuellen Änderungen suchen, die Ihre Probleme erklären könnten. Es ist besonders wichtig, unter den folgenden Umständen nach Änderungen zu suchen:

  • Code für Dienste im Vordergrund, der zuvor funktioniert hat, schlägt jetzt fehl
  • Sie haben gerade mit dem Testen auf einer neuen Plattformversion begonnen oder das Ziel-API-Level Ihrer App geändert

Wenn Sie Ihr Gerät außerdem mit einer Entwicklervorschau der Plattform testen, sollten Sie die neueste Version der Dokumentation zur Entwicklervorschau prüfen.

ANR-Fehler („App antwortet nicht“)

Unter bestimmten Umständen muss eine App ihren Dienst im Vordergrund beenden. Wenn die App den Dienst nicht beendet, beendet das System den Dienst und löst einen ANR-Fehler („App antwortet nicht“) aus.

Kurzer Dienst wird zu lange ausgeführt und verursacht einen ANR-Fehler

Dienste im Vordergrund, die den kurzen Dienst-Typ verwenden, müssen schnell abgeschlossen werden, innerhalb von etwa drei Minuten. Wenn die Zeit abläuft, ruft das System die Methode Service.onTimeout(int,int) des Dienstes auf. Der Dienst hat einige Sekunden Zeit, um stopSelf()aufzurufen. Wenn der Dienst sich nicht selbst beendet, löst das System einen Fehler vom Typ „App antwortet nicht“ aus.

Diagnose:

Wenn der ANR-Fehler dadurch verursacht wurde, dass ein Dienst im Vordergrund sich nicht selbst beendet hat, löst das System eine interne Ausnahme aus. Sie können prüfen, ob dies das Problem war, indem Sie die ANR-Berichte prüfen. Wenn dies das Problem ist, enthält der Bericht die folgende Meldung:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"

Behebung:

Achten Sie darauf, dass alle zeitlich begrenzten Dienste im Vordergrund ihre Arbeit beenden und stopForeground(int) innerhalb des Systemzeitlimits aufrufen.

Lassen Sie Ihre Dienste im Vordergrund Service.onTimeout(int,int) implementieren. Achten Sie darauf, dass Ihre Implementierung dieser Methode sofort stopSelf() aufruft.

Ausnahmen bei Diensten im Vordergrund

In diesem Abschnitt werden mehrere Probleme mit Diensten im Vordergrund beschrieben, die dazu führen können, dass das System eine Ausnahme auslöst. Wenn die App die Ausnahme nicht abfängt, wird dem Nutzer ein Dialogfeld angezeigt, in dem er darüber informiert wird, dass die App beendet wurde.

In einigen Fällen löst das System eine interne Ausnahme aus. In diesen Fällen können Sie die Ausnahme im Stacktrace ermitteln und in Logcat nach detaillierteren Fehlerinformationen suchen.

Interne Ausnahme: Zeitüberschreitung

Das System legt ein Limit fest für die Ausführungszeit von Diensten im Vordergrund zur Datensynchronisierung und Medien verarbeitung, während die App im Hintergrund ausgeführt wird. Wenn der Dienst dieses Limit überschreitet, ruft das System die Methode Service.onTimeout(int,int) des Dienstes auf. Der Dienst hat einige Sekunden Zeit, um stopSelf() aufzurufen. Wenn der Dienst sich nicht selbst beendet, generiert das System eine interne RemoteServiceException, die zum Absturz der App führt.

Diagnose:

Sie können die Ausnahme im Stacktrace ermitteln und in Logcat nach detaillierteren Fehlerinformationen suchen. In diesem Fall enthält Logcat die folgende Fehlermeldung:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Behebung:

Achten Sie darauf, dass alle zeitlich begrenzten Dienste im Vordergrund ihre Arbeit beenden und stopForeground(int) innerhalb des Systemzeitlimits aufrufen.

Lassen Sie Ihre Dienste im Vordergrund Service.onTimeout(int,int) implementieren. Achten Sie darauf, dass Ihre Implementierung dieser Methode sofort stopSelf() aufruft.

Interne Ausnahme: ForegroundServiceDidNotStartInTimeException

Wenn Sie einen Dienst durch Aufrufen context.startForegroundService() starten, hat dieser Dienst einige Sekunden Zeit, sich durch Aufrufen ServiceCompat.startForeground() zu einem Dienst im Vordergrund zu machen. Wenn der Dienst dies nicht tut, löst das System eine interne ForegroundServiceDidNotStartInTimeException aus.

Diagnose:

Sie können die Ausnahme im Stacktrace ermitteln und in Logcat nach detaillierteren Fehlerinformationen suchen. In diesem Fall enthält Logcat die folgende Fehlermeldung:

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

Behebung:

Achten Sie darauf, dass alle neu erstellten Dienste im Vordergrund innerhalb weniger Sekunden ServiceCompat.startForeground() aufrufen.

WorkManager:

Diese Ausnahme kann auch bei WorkManager Workern auftreten, die einen Dienst im Vordergrund ausführen (Aufruf von setForegound oder setForegroundAsync). Wenn sich der Lebenszyklus von zwei Workern im Vordergrund überschneidet, da ein Worker versucht, einen Dienst im Vordergrund zu starten, während ein zuvor ausgeführter Dienst im Vordergrund versucht, herunterzufahren, wird dieser Absturz von folgendem Log begleitet:

Re-initializing SystemForegroundService after a request to shut-down

Ein Fix für diesen Absturz wurde in WorkManager Version 2.10.5 eingeführt.

Wenn diese Ausnahme in Ihrer App auftritt, aktualisieren Sie auf die neueste Version von WorkManager und melden Sie alle weiterhin bestehenden Probleme im WorkManager Issue-Tracker.

ForegroundServiceStartNotAllowedException

Fehler:

Das System löst ForegroundServiceStartNotAllowedException aus.

Ursache:

Dies wird in der Regel dadurch verursacht, dass die App einen Dienst im Vordergrund im Hintergrund startet, ohne dass eine gültige Ausnahme vorliegt.

Ab Android 12 (API-Level 31) dürfen Apps keine Dienste im Vordergrund starten, während die App im Hintergrund ausgeführt wird. Es gibt jedoch einige Ausnahmen. Wenn Sie versuchen, einen Dienst im Vordergrund im Hintergrund zu starten, und die Anforderungen einer der Ausnahmen nicht erfüllen, löst das System ForegroundServiceStartNotAllowedException aus. Das System tut dies auch, wenn Sie die Anforderungen der Ausnahme nicht erfüllen.

Eine App kann beispielsweise eine Schaltfläche haben, auf die ein Nutzer klicken kann. Dadurch führt die App eine Verarbeitung durch und startet dann einen Dienst im Vordergrund. In diesem Fall besteht die Gefahr, dass der Nutzer auf die Schaltfläche klickt und die App dann sofort in den Hintergrund verschiebt. Die App würde dann versuchen, den Dienst im Hintergrund zu starten. Wenn die App keine der angegebenen Ausnahmen erfüllt, löst das System eine ForegroundServiceStartNotAllowedException aus.

Außerdem haben einige Ausnahmen ein kurzes Zeitlimit. Es gibt beispielsweise eine kurze Ausnahme, wenn Ihre App einen Dienst im Vordergrund als Reaktion auf eine FCM-Nachricht mit hoher Priorität startet. Wenn Sie den Dienst nicht schnell genug starten, erhalten Sie eine ForegroundServiceStartNotAllowedException.

Bestimmte Ausnahmen werden mit neuen Android-Versionen manchmal restriktiver. Wenn Sie die Android-Version geändert haben, auf die Ihre App ausgerichtet ist, prüfen Sie die Dokumentation zu Änderungen an Diensten im Vordergrund und bestätigen Sie, dass Ihre App weiterhin eine der zulässigen Ausnahmen erfüllt.

Behebung:

Ändern Sie den Workflow Ihrer App so, dass keine Dienste im Vordergrund gestartet werden müssen, während die App im Hintergrund ausgeführt wird, oder bestätigen Sie, dass Ihre App eine der Ausnahmen erfüllt.

Sie können lebenszyklusbezogene Komponenten verwenden, um den Lebenszyklus Ihrer App zu verwalten, damit Sie nicht versehentlich versuchen, einen Dienst im Vordergrund im Hintergrund zu starten.

SecurityException

Fehler:

Das System löstSecurityException aus.

Ursache:

Ihre App hat versucht, einen Dienst im Vordergrund zu starten, ohne die erforderlichen Berechtigungen zu haben.

  • Wenn eine App auf Android 9 (API-Level 28) oder höher ausgerichtet ist, muss sie die Berechtigung FOREGROUND_SERVICE haben, um einen Dienst im Vordergrund zu starten.
  • Wenn eine App auf Android 14 (API-Level 34) oder höher ausgerichtet ist, muss sie alle Voraussetzungen für ihren Diensttyp im Vordergrund erfüllen. Diese Voraussetzungen werden in der Dokumentation zu Diensttypen im Vordergrund beschrieben. Beachten Sie insbesondere die folgenden Anforderungen:
    • Für mehrere Diensttypen im Vordergrund sind bestimmte Laufzeitberechtigungen erforderlich. Für einen Dienst im Vordergrund für Remote-Messaging ist beispielsweise die Berechtigung FOREGROUND_SERVICE_REMOTE_MESSAGING erforderlich.
  • In mehreren Fällen gelten zusätzliche Einschränkungen für die Verwendung der Berechtigungen, die für einige Diensttypen im Vordergrund erforderlich sind. Diese Berechtigungen werden der App nur gewährt, wenn sie im Vordergrund ausgeführt wird (mit einigen spezifischen Ausnahmen). Das bedeutet, dass das System auch dann eine SecurityException auslöst, wenn Ihre App eine dieser Berechtigungen angefordert und erhalten hat, aber versucht, den Dienst im Vordergrund zu starten, während die App im Hintergrund ausgeführt wird. Dies gilt auch, wenn die App eine Ausnahme hat, um einen Dienst im Vordergrund im Hintergrund zu starten. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Verwendung erforderlich sind.
    • Möglicherweise erhalten Sie eine SecurityException, wenn Sie die erforderlichen Berechtigungen angefordert haben, den Dienst im Vordergrund aber starten, bevor Sie bestätigt haben, dass die erforderlichen Berechtigungen gewährt wurden.

Behebung:

Fordern Sie alle entsprechenden Berechtigungen für Dienste im Vordergrund an, bevor Sie den Dienst im Vordergrund starten, und bestätigen Sie, dass Sie alle anderen Laufzeitvoraussetzungen erfüllt haben.