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.
In diesem Dokument werden die folgenden Themen behandelt:
Vor der Fehlerbehebung
Nach kürzlichen Ä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-Plattformveröffentlichungen 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 in der Dokumentation zu Änderungen an Diensten im Vordergrund nachsehen, ob es kürzlich Änderungen gab, die Ihre Probleme erklären könnten. In folgenden Fällen ist es besonders wichtig, auf Änderungen zu achten:
- Code für Dienst im Vordergrund, der zuvor funktionierte, funktioniert jetzt nicht mehr
- Sie haben gerade mit Tests für eine neue Plattformversion begonnen oder das API-Level geändert, auf das Ihre App ausgerichtet ist.
Wenn Sie Ihr Gerät mit einer Entwicklervorschau der Plattform testen, sollten Sie außerdem die aktuelle Version der Dokumentation zur Entwicklervorschau lesen.
ANR-Fehler („App antwortet nicht“)
Unter bestimmten Umständen wird von einer App erwartet, dass sie ihren Dienst im Vordergrund beendet. Wenn die App den Dienst nicht beendet, beendet das System den Dienst und löst den Fehler App antwortet nicht (ANR) aus.
Kurzer Dienst läuft zu lange und verursacht ANR
Dienste im Vordergrund, die den Typ Kurzdienst 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, stopSelf()
aufzurufen. Wenn der Dienst nicht automatisch beendet wird, löst das System den Fehler „Anwendung reagiert nicht“ aus.
Diagnose:
Wenn die ANR durch einen Dienst im Vordergrund verursacht wurde, der sich nicht selbst beenden konnte, löst das System eine interne Ausnahme aus. Sie können das in Logcat prüfen. In diesem Fall enthält das Protokoll 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]"
Problemlösung:
Achten Sie darauf, dass alle zeitbegrenzten Dienste im Vordergrund ihre Arbeit innerhalb des Zeitlimits des Systems beenden und stopForeground(int)
aufrufen.
Implementieren Sie Service.onTimeout(int,int)
in Ihren Diensten im Vordergrund.
Achten Sie darauf, dass in Ihrer Implementierung dieser Methode stopSelf()
sofort aufgerufen wird.
Ausnahmen für Dienste im Vordergrund
In diesem Abschnitt werden verschiedene 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 in einem Dialogfeld angezeigt, dass die App beendet wurde.
In einigen Fällen wirft das System eine interne Ausnahme aus. Sie können diese Ausnahmen nicht abfangen, aber in Logcat nachsehen, welche Ausnahme ausgelöst wurde.
Interne Ausnahme: Zeitüberschreitung
Das System schränkt ein, wie lange Dienste für die Datensynchronisierung und Medienverarbeitung im Vordergrund ausgeführt werden können, während die App im Hintergrund läuft. Wenn der Dienst dieses Limit überschreitet, ruft das System die Service.onTimeout(int,int)
-Methode des Dienstes auf. Der Dienst hat einige Sekunden Zeit, stopSelf()
aufzurufen. Wenn der Dienst nicht automatisch beendet wird, generiert das System eine interne Ausnahme, die zum Absturz der App führt.
Diagnose:
Wenn das Zeitlimit überschritten wurde, enthält Logcat die folgende Meldung:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Problemlösung:
Achten Sie darauf, dass alle zeitbegrenzten Dienste im Vordergrund ihre Arbeit innerhalb des Zeitlimits des Systems abschließen und stopForeground(int)
aufrufen.
Implementieren Sie Service.onTimeout(int,int)
in Ihren Diensten im Vordergrund.
Achten Sie darauf, dass in Ihrer Implementierung dieser Methode stopSelf()
sofort 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 Dienst im Vordergrund zu machen.
Andernfalls löst das System einen ANR-Fehler aus.
Diagnose:
Wenn ein Dienst im Vordergrund nicht rechtzeitig gestartet wurde, stürzt die App ab und der Nutzer sieht das Dialogfeld App wurde angehalten. In diesem Fall wird in Logcat die folgende Meldung angezeigt:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
Problemlösung:
Achten Sie darauf, dass alle neu erstellten Dienste im Vordergrund ServiceCompat.startForeground()
innerhalb weniger Sekunden aufrufen.
ForegroundServiceStartNotAllowedException
Fehler:
Das System gibt ForegroundServiceStartNotAllowedException
zurück.
Ursache:
Dies wird in der Regel dadurch verursacht, dass die App einen Dienst im Vordergrund aus dem Hintergrund startet, ohne dass es dafür eine gültige Ausnahme gibt.
Ab Android 12 (API-Level 31) dürfen Apps keine Dienste im Vordergrund starten, während die App im Hintergrund ausgeführt wird, mit einigen Ausnahmen.
Wenn Sie versuchen, einen Dienst im Vordergrund aus dem Hintergrund zu starten, und nicht die Anforderungen einer der Ausnahmen erfüllen, löst das System ForegroundServiceStartNotAllowedException
aus. Das System führt dies auch durch, 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 einige Verarbeitungsschritte aus 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 stellt. In diesem Fall versucht die App, den Dienst aus dem Hintergrund zu starten. Wenn die App keinen der angegebenen Ausnahmefälle erfüllt, löst das System eine ForegroundServiceStartNotAllowedException
aus.
Außerdem gelten für einige Ausnahmen kurze Fristen. 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-Releases manchmal strenger. Wenn Sie die Android-Version geändert haben, auf die Ihre App ausgerichtet ist, lesen Sie die Dokumentation zu Änderungen an Diensten im Vordergrund und prüfen Sie, ob Ihre App weiterhin eine der zulässigen Ausnahmen erfüllt.
Problemlösung:
Ä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 prüfen Sie, ob Ihre App eine der Ausnahmen erfüllt.
Sie können Lebenszykluskomponenten wie LiveData
verwenden, um den Lebenszyklus Ihrer App zu verwalten, damit Sie nicht versehentlich versuchen, einen Dienst im Vordergrund aus dem 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 den Typ des Dienstes im Vordergrund erfüllen. Diese Voraussetzungen werden in der Dokumentation zu Diensttypen im Vordergrund beschrieben. Beachten Sie insbesondere die folgenden Anforderungen:
- Für einige 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 einige 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 einigen Arten von Diensten im Vordergrund benötigt werden. Diese Berechtigungen werden der App nur gewährt, wenn sie im Vordergrund ausgeführt wird (mit einigen wenigen Ausnahmen). Das bedeutet, dass das System eine
SecurityException
auslöst, auch wenn Ihre App eine dieser Berechtigungen angefordert und erhalten hat, und versucht, den Dienst im Vordergrund zu starten, während die App im Hintergrund ausgeführt wird, selbst 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 für die Nutzung erforderlich sind.- Möglicherweise wird
SecurityException
angezeigt, wenn Sie die erforderlichen Berechtigungen angefordert haben, den Dienst im Vordergrund aber starten, bevor Sie bestätigt haben, dass die erforderlichen Berechtigungen erteilt wurden.
- Möglicherweise wird
Problemlösung:
Bevor Sie den Dienst im Vordergrund starten, müssen Sie alle erforderlichen Berechtigungen für Dienste im Vordergrund anfordern und prüfen, ob Sie alle anderen Laufzeitvoraussetzungen erfüllen.