Auf dieser Seite werden einige häufige Gründe für Fehler bei Vordergrunddiensten 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
Nach kürzlich vorgenommenen Änderungen an Vordergrunddiensten suchen
Wenn Vordergrunddienste nicht ordnungsgemäß verwendet werden, kann dies negative Auswirkungen auf die Geräteleistung und die Akkulaufzeit haben. 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 Vordergrunddiensten haben, sollten Sie in der Dokumentation Änderungen an Vordergrunddiensten nachsehen, ob es kürzlich Änderungen gab, die Ihre Probleme erklären könnten. Es ist besonders wichtig, in den folgenden Fällen nach Änderungen zu suchen:
- Code für den Dienst im Vordergrund, der zuvor funktioniert hat, schlägt jetzt fehl
- Sie haben gerade mit dem Testen auf einer neuen Plattformversion begonnen oder das API-Level geändert, auf das Ihre App ausgerichtet ist.
Wenn Sie Ihr Gerät mit einer Developer Preview der Plattform testen, sollten Sie außerdem die aktuelle Version der Developer Preview-Dokumentation lesen.
„App antwortet nicht“-Fehler (ANR)
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 App antwortet nicht-Fehler (ANR) aus.
Kurze Dienste laufen zu lange und verursachen ANR
Vordergrunddienste, die den Typ shortService verwenden, müssen schnell, innerhalb von etwa drei Minuten, abgeschlossen werden. 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 sich nicht selbst beendet, löst das System einen Fehler vom Typ „Anwendung reagiert nicht“ aus.
Diagnose:
Wenn der ANR durch einen Vordergrunddienst verursacht wurde, der sich nicht selbst beendet hat, löst das System eine interne Ausnahme aus. Sie können überprüfen, ob dies das Problem war, indem Sie die ANR-Berichte aufrufen. 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 Vordergrunddienste ihre Arbeit beenden und stopForeground(int)
innerhalb des Systemzeitlimits aufrufen.
Ihre Dienste im Vordergrund müssen Service.onTimeout(int,int)
implementieren.
Achten Sie darauf, dass in Ihrer Implementierung dieser Methode sofort stopSelf()
aufgerufen wird.
Ausnahmen für Dienste im Vordergrund
In diesem Abschnitt werden verschiedene Probleme mit Vordergrunddiensten 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 nachsehen und Logcat aufrufen, um detailliertere Fehlerinformationen zu erhalten.
Interne Ausnahme: Zeitüberschreitung
Das System legt eine Obergrenze fest für die Dauer, die Vordergrunddienste für die Datensynchronisierung und Medienverarbeitung ausgeführt werden können, während sich die App im Hintergrund befindet. Wenn der Dienst dieses Limit überschreitet, ruft das System die Service.onTimeout(int,int)
-Methode des Dienstes auf. Der Dienst hat einige Sekunden Zeit, um stopSelf()
aufzurufen. Wenn der Dienst nicht selbst beendet wird, generiert das System einen internen RemoteServiceException
, der zum Absturz der App führt.
Diagnose:
Die Ausnahme können Sie im Stacktrace nachsehen. Detailliertere Fehlerinformationen finden Sie im Logcat. 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 Vordergrunddienste ihre Arbeit beenden und stopForeground(int)
innerhalb des Systemzeitlimits aufrufen.
Ihre Dienste im Vordergrund müssen Service.onTimeout(int,int)
implementieren.
Achten Sie darauf, dass in Ihrer Implementierung dieser Methode sofort stopSelf()
aufgerufen wird.
Interne Ausnahme: 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 Vordergrunddienst zu machen.
Wenn der Dienst dies nicht tut, wird eine interne ForegroundServiceDidNotStartInTimeException
ausgelöst.
Diagnose:
Die Ausnahme können Sie im Stacktrace nachsehen. Detailliertere Fehlerinformationen finden Sie im Logcat. 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.
ForegroundServiceStartNotAllowedException
Fehler:
Das System gibt 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 aus dem Hintergrund zu starten, und die Anforderungen für eine der Ausnahmen nicht erfüllen, löst das System ForegroundServiceStartNotAllowedException
aus. Das System führt diese Schritte auch aus, wenn Sie die Anforderungen für die Ausnahme nicht erfüllen.
Eine App kann beispielsweise eine Schaltfläche enthalten, 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 eine der angegebenen Ausnahmen nicht 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 Vordergrunddienst 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, lesen Sie die Dokumentation zu Änderungen bei Vordergrunddiensten 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 die App im Hintergrund ausgeführt wird. Alternativ können Sie bestätigen, dass Ihre App eine der Ausnahmen erfüllt.
Mit lebenszyklusbewussten Komponenten können Sie den Lebenszyklus Ihrer App verwalten, damit Sie nicht versehentlich versuchen, einen Vordergrunddienst aus dem Hintergrund zu starten.
SecurityException
Fehler:
Das System gibt SecurityException
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 den jeweiligen Diensttyp im Vordergrund erfüllen. Diese Voraussetzungen werden in der Dokumentation zu Typen von Diensten im Vordergrund 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_MESSAGING
haben.
- 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 die Verwendung von Berechtigungen, die für bestimmte Arten von Diensten im Vordergrund erforderlich sind. Diese Berechtigungen werden der App nur erteilt, wenn sie im Vordergrund ausgeführt wird (mit einigen spezifischen Ausnahmen). Das bedeutet: Selbst wenn Ihre App eine dieser Berechtigungen angefordert und erhalten hat, löst das System eine
SecurityException
aus, wenn die App versucht, den Dienst im Vordergrund zu starten, während sie im Hintergrund ausgeführt wird. Das 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 Vordergrunddiensten, für die Berechtigungen für die Verwendung während der Nutzung erforderlich sind.- Möglicherweise erhalten Sie eine
SecurityException
, wenn Sie die erforderlichen Berechtigungen angefordert haben, den Dienst im Vordergrund jedoch starten, bevor Sie bestätigt haben, dass die erforderlichen Berechtigungen erteilt wurden.
- Möglicherweise erhalten Sie eine
Behebung:
Bevor Sie den Dienst im Vordergrund starten, müssen Sie alle entsprechenden Berechtigungen für Dienste im Vordergrund anfordern und bestätigen, dass Sie alle anderen Voraussetzungen für die Laufzeit erfüllen.