Auf dieser Seite werden einige häufige Gründe für Fehler bei Diensten im Vordergrund erläutert. Außerdem finden Sie hier Informationen dazu, wie Sie die Ursache des Problems ermitteln können.
In diesem Dokument werden die folgenden Probleme behandelt:
Vor der Fehlerbehebung
Nach kürzlich vorgenommenen Änderungen an Diensten im Vordergrund suchen
Wenn Dienste im Vordergrund nicht ordnungsgemäß verwendet werden, kann sich das negativ auf die Geräteleistung und die Akkulaufzeit auswirken. Aus diesem Grund werden bei Android-Plattform-Releases häufig Änderungen am Verhalten von Diensten im Vordergrund vorgenommen, um diese negativen Auswirkungen zu begrenzen.
Wenn du Probleme mit Diensten im Vordergrund hast, solltest du die Dokumentation zu den Änderungen an Diensten im Vordergrund lesen und prüfen, ob es aktuelle Änderungen gibt, die deine Probleme erklären könnten. In folgenden Fällen ist es besonders wichtig, nach Änderungen zu suchen:
- Code für Dienste im Vordergrund, der zuvor funktioniert hat, schlägt jetzt fehl
- Du hast gerade mit dem Testen einer neuen Plattformversion begonnen oder das Ziel-API-Level deiner App geändert.
Wenn du dein Gerät mit einer Entwicklervorschau der Plattform testest, solltest du außerdem die aktuelle Version der Dokumentation zur Entwicklervorschau lesen.
ANR-Fehler („App antwortet nicht“)
Unter bestimmten Umständen muss eine App ihren Dienst im Vordergrund beenden. Wenn die App den Dienst nicht beendet, wird er vom System beendet und es wird ein ANR-Fehler (App antwortet nicht) ausgelöst.
Kurzer Dienst wird zu lange ausgeführt, was zu ANR führt
Dienste im Vordergrund, die den Typ Kurzer Dienst verwenden, müssen schnell abgeschlossen werden, d. h. innerhalb von etwa drei Minuten. Wenn die Zeit abgelaufen ist, ruft das System die Methode Service.onTimeout(int,int) des Dienstes auf. Der Dienst hat einige Sekunden Zeit, um stopSelf() aufzurufen. Wenn der Dienst nicht von selbst beendet wird, löst das System einen Fehler vom Typ „App antwortet nicht“ aus.
Diagnostizieren:
Wenn der ANR-Fehler dadurch verursacht wurde, dass ein Dienst im Vordergrund nicht beendet wurde, löst das System eine interne Ausnahme aus. Sie können in den ANR-Berichten nachsehen, ob dies das Problem war. 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 für Dienste 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 finden und in Logcat nach detaillierteren Fehlerinformationen suchen.
Interner Ausnahmefehler: Zeitüberschreitung
Das System legt ein Limit fest, wie lange Dienste im Vordergrund für die Datensynchronisierung und Medienverarbeitung ausgeführt werden können, 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 nicht von selbst beendet wird, generiert das System einen internen RemoteServiceException, der zum Absturz der App führt.
Diagnostizieren:
Sie können die Ausnahme im Stacktrace finden und in Logcat nach detaillierteren Fehlerinformationen suchen. In diesem Fall wird in Logcat die folgende Fehlermeldung angezeigt:
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 Zeitlimits des Systems aufrufen.
Lassen Sie Ihre Dienste im Vordergrund Service.onTimeout(int,int) implementieren.
Achten Sie darauf, dass Ihre Implementierung dieser Methode sofort stopSelf() aufruft.
Interner Ausnahmefehler: ForegroundServiceDidNotStartInTimeException
Wenn Sie einen Dienst durch Aufrufen von context.startForegroundService() starten, hat dieser Dienst einige Sekunden Zeit, sich durch Aufrufen von ServiceCompat.startForeground() zu einem Dienst im Vordergrund hochzustufen.
Wenn der Dienst dies nicht tut, wird ein interner ForegroundServiceDidNotStartInTimeException ausgelöst.
Diagnostizieren:
Sie können die Ausnahme im Stacktrace finden und in Logcat nach detaillierteren Fehlerinformationen suchen. In diesem Fall wird in Logcat die folgende Fehlermeldung angezeigt:
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 (setForegound oder setForegroundAsync aufrufen). Wenn sich der Lebenszyklus von zwei Workern im Vordergrund überschneidet, weil ein Worker versucht, einen Dienst im Vordergrund zu starten, während ein zuvor ausgeführter Dienst im Vordergrund versucht, sich zu beenden, wird dieser Absturz von folgendem Log begleitet:
Re-initializing SystemForegroundService after a request to shut-down
Eine Fehlerbehebung 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 verbleibenden Probleme im Issue Tracker von WorkManager.
ForegroundServiceStartNotAllowedException
Fehler:
Das System gibt ForegroundServiceStartNotAllowedException aus.
Ursache:
Dies wird in der Regel dadurch verursacht, dass die App einen Dienst im Vordergrund aus dem Hintergrund startet, wenn keine 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 aus dem Hintergrund zu starten, und die Anforderungen einer der Ausnahmen nicht erfüllen, wird vom System ForegroundServiceStartNotAllowedException ausgegeben. Das System tut dies auch, wenn Sie die Anforderungen für die Ausnahme nicht erfüllen.
Eine App kann beispielsweise eine Schaltfläche haben, auf die ein Nutzer klicken kann, wodurch die App eine Verarbeitung durchführt und dann einen Dienst im Vordergrund startet. 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, gibt das System einen ForegroundServiceStartNotAllowedException aus.
Außerdem sind einige Ausnahmen nur für einen kurzen Zeitraum gültig. Beispielsweise gibt es 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 einen ForegroundServiceStartNotAllowedException.
Bestimmte Ausnahmen werden mit neuen Android-Releases manchmal restriktiver. Wenn Sie die Android-Version geändert haben, auf die Ihre App ausgerichtet ist, lesen Sie die Dokumentation zu den Änderungen bei Diensten im Vordergrund und prüfen Sie, ob 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 sich die App im Hintergrund befindet, oder bestätigen Sie, dass Ihre App eine der Ausnahmen erfüllt.
Du kannst lebenszyklusbewusste Komponenten verwenden, um den Lebenszyklus deiner App zu verwalten, damit du nicht versehentlich versuchst, einen Dienst im Vordergrund aus dem Hintergrund zu starten.
SecurityException
Fehler:
Das System löst SecurityException aus.
Ursache:
In Ihrer App wurde versucht, einen Dienst im Vordergrund zu starten, ohne dass die erforderlichen Berechtigungen vorhanden waren.
- Wenn eine App auf Android 9 (API-Level 28) oder höher ausgerichtet ist, muss sie die Berechtigung
FOREGROUND_SERVICEhaben, 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 den Typ des Dienstes im Vordergrund erfüllen. Diese Voraussetzungen werden in der Dokumentation zu Typen von Diensten im Vordergrund ausführlich beschrieben. Beachten Sie insbesondere die folgenden Anforderungen:
- Für mehrere Typen von Diensten im Vordergrund sind bestimmte Laufzeitberechtigungen erforderlich. Ein Dienst im Vordergrund für Remote-Messaging muss beispielsweise die Berechtigung
FOREGROUND_SERVICE_REMOTE_MESSAGINGhaben.
- Für mehrere Typen von Diensten im Vordergrund sind bestimmte Laufzeitberechtigungen erforderlich. Ein Dienst im Vordergrund für Remote-Messaging muss beispielsweise die Berechtigung
- In einigen Fällen gelten zusätzliche Einschränkungen für Berechtigungen, die von bestimmten Typen von Diensten im Vordergrund benötigt werden, wenn die App verwendet wird. Diese Berechtigungen werden der App nur gewährt, wenn sie im Vordergrund ausgeführt wird (mit einigen Ausnahmen). Das bedeutet, dass das System eine
SecurityExceptionauslöst, wenn die App versucht, den Dienst im Vordergrund zu starten, während sie im Hintergrund ausgeführt wird, auch wenn die App eine Ausnahme hat, um einen Dienst im Vordergrund aus dem Hintergrund zu starten. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen zur Nutzung erforderlich sind.- Möglicherweise erhalten Sie einen
SecurityException, wenn Sie die erforderlichen Berechtigungen angefordert haben, aber den Dienst im Vordergrund starten, bevor Sie bestätigt haben, dass die erforderlichen Berechtigungen gewährt wurden.
- Möglicherweise erhalten Sie einen
Behebung:
Bevor Sie den Dienst im Vordergrund starten, fordern Sie alle entsprechenden Berechtigungen für Dienste im Vordergrund an und prüfen Sie, ob alle anderen Laufzeitvoraussetzungen erfüllt sind.