Damit Entwickler nutzerorientierte Dienste im Vordergrund bewusster definieren können, wurde in Android 10 das Attribut android:foregroundServiceType im Element <service> eingeführt.
Wenn Ihre App auf Android 14 ausgerichtet ist, müssen Sie die entsprechenden Typen von Diensten im Vordergrund angeben. Wie in früheren Android-Versionen können mehrere Typen kombiniert werden. In dieser Liste sind die Typen von Diensten im Vordergrund aufgeführt, aus denen Sie auswählen können:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
Wenn ein Anwendungsfall in Ihrer App keinem dieser Typen zugeordnet ist, empfehlen wir Ihnen dringend, Ihre Logik auf WorkManager oder vom Nutzer initiierte Datenübertragungsjobs umzustellen.
Die Typen health, remoteMessaging, shortService, specialUse und systemExempted sind in Android 14 neu.
Das folgende Code-Snippet enthält ein Beispiel für die Deklaration eines Diensttyps im Vordergrund im Manifest:
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
Wenn in einer App, die auf Android 14 ausgerichtet ist, im Manifest keine Typen für einen bestimmten Dienst definiert sind, wird vom System MissingForegroundServiceTypeException ausgelöst, wenn startForeground() für diesen Dienst aufgerufen wird.
Neue Berechtigung für die Verwendung von Diensten im Vordergrund erklären
Wenn Apps, die auf Android 14 ausgerichtet sind, einen Dienst im Vordergrund verwenden, müssen sie eine bestimmte Berechtigung deklarieren, die sich auf den Diensttyp im Vordergrund bezieht, der in Android 14 eingeführt wurde. Diese Berechtigungen werden auf dieser Seite im Abschnitt Vorgesehene Anwendungsfälle und Erzwingung für jeden Typ von Dienst im Vordergrund in den Abschnitten mit der Überschrift „Berechtigung, die Sie in Ihrer Manifestdatei deklarieren müssen“ aufgeführt.
Alle Berechtigungen sind als normale Berechtigungen definiert und werden standardmäßig gewährt. Nutzer können diese Berechtigungen nicht widerrufen.
Typ des Diensts im Vordergrund zur Laufzeit angeben
Für Anwendungen, die Dienste im Vordergrund starten, empfiehlt es sich, die ServiceCompat-Version von startForeground() zu verwenden (verfügbar in androidx-core 1.12 und höher). Dabei geben Sie eine binäre Ganzzahl mit den Typen der Dienste im Vordergrund an. Sie können einen oder mehrere Typwerte übergeben.
Normalerweise sollten Sie nur die Typen deklarieren, die für einen bestimmten Anwendungsfall erforderlich sind. So lassen sich die Anforderungen des Systems für jeden Diensttyp im Vordergrund leichter erfüllen. Wenn ein Dienst im Vordergrund mit mehreren Typen gestartet wird, muss er die Anforderungen der Plattformdurchsetzung für alle Typen einhalten.
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
Wenn der Typ des Dienstes im Vordergrund im Aufruf nicht angegeben ist, wird der Standardtyp verwendet, der im Manifest definiert ist. Wenn Sie den Diensttyp nicht im Manifest angegeben haben, wirft das System MissingForegroundServiceTypeException aus.
Wenn der Dienst im Vordergrund nach dem Starten neue Berechtigungen benötigt, sollten Sie startForeground() noch einmal aufrufen und die neuen Diensttypen hinzufügen. Angenommen, eine Fitness-App führt einen Lauf-Tracker-Dienst aus, für den immer location-Informationen erforderlich sind, aber möglicherweise keine oder media-Berechtigungen. Du musst sowohl location als auch mediaPlayback im Manifest deklarieren. Wenn ein Nutzer einen Lauf startet und nur seinen Standort erfassen lassen möchte, sollte Ihre App startForeground() aufrufen und nur den Diensttyp location übergeben. Wenn der Nutzer die Audiowiedergabe starten möchte, ruf startForeground() noch einmal auf und übergebe location|mediaPlayback.
Systemlaufzeitprüfungen
Das System prüft, ob die Dienste im Vordergrund ordnungsgemäß verwendet werden, und ob die App die erforderlichen Laufzeitberechtigungen angefordert oder die erforderlichen APIs verwendet.
So erwartet das System beispielsweise, dass Apps, die den Diensttyp FOREGROUND_SERVICE_TYPE_LOCATION verwenden, entweder ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION anfordern.
Das bedeutet, dass Apps beim Anfordern von Berechtigungen vom Nutzer und Starten von Diensten im Vordergrund einer sehr bestimmten Reihenfolge folgen müssen. Berechtigungen müssen vor dem Aufruf von startForeground() angefordert und erteilt werden. Apps, die die entsprechenden Berechtigungen nach dem Start des Dienstes im Vordergrund anfordern, müssen diese Reihenfolge der Vorgänge ändern und die Berechtigung anfordern, bevor der Dienst im Vordergrund gestartet wird.
Die spezifischen Anforderungen der Plattform finden Sie auf dieser Seite im Abschnitt Vorgesehene Anwendungsfälle und Durchsetzung für jeden Typ von Dienst im Vordergrund unter „Laufzeitanforderungen“.
Vorgesehene Anwendungsfälle und Erzwingung für jeden Typ von Diensten im Vordergrund
Wenn Sie einen bestimmten Diensttyp im Vordergrund verwenden möchten, müssen Sie in Ihrer Manifestdatei eine bestimmte Berechtigung deklarieren, bestimmte Laufzeitanforderungen erfüllen und Ihre App muss einen der beabsichtigten Anwendungsfälle für diesen Typ erfüllen. In den folgenden Abschnitten werden die Berechtigung, die Sie deklarieren müssen, die Laufzeitvoraussetzungen und die beabsichtigten Anwendungsfälle für jeden Typ erläutert.
Kamera
- Typ des Diensts im Vordergrund, der im Manifest unter
android:foregroundServiceTypedeklariert werden soll camera- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_CAMERA- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_CAMERA- Laufzeitvoraussetzungen
Laufzeitberechtigung
CAMERAanfordern und erhaltenHinweis:Die Laufzeitberechtigung
CAMERAunterliegt Einschränkungen bei der Nutzung. Aus diesem Grund können Siecamera-Dienste im Vordergrund nur erstellen, wenn sich Ihre App im Hintergrund befindet, mit wenigen Ausnahmen. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind.- Beschreibung
Zugriff auf die Kamera im Hintergrund ist weiterhin möglich, z. B. über Videoanruf-Apps, die Multitasking zulassen.
Verbundenes Gerät
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypeconnectedDevice- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_CONNECTED_DEVICE- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- Laufzeitvoraussetzungen
Mindestens eine der folgenden Bedingungen muss erfüllt sein:
Deklarieren Sie mindestens eine der folgenden Berechtigungen in Ihrem Manifest:
Sie müssen mindestens eine der folgenden Laufzeitberechtigungen anfordern und erhalten:
UsbManager.requestPermission()anrufen
- Beschreibung
Interaktionen mit externen Geräten, die eine Bluetooth‑, NFC‑, IR‑, USB‑ oder Netzwerkverbindung erfordern.
- Alternativen
Wenn Ihre App eine kontinuierliche Datenübertragung an ein externes Gerät ausführen muss, sollten Sie stattdessen den Companion Device Manager verwenden. Mit der API zur Anwesenheit von Companion-Geräten können Sie dafür sorgen, dass Ihre App weiter ausgeführt wird, solange sich das Companion-Gerät in Reichweite befindet.
Wenn Ihre App nach Bluetooth-Geräten suchen muss, können Sie stattdessen die Bluetooth Scan API verwenden.
Datensynchronisierung
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypedataSync- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_DATA_SYNC- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_DATA_SYNC- Laufzeitvoraussetzungen
- Keine
- Beschreibung
Datenübertragungsvorgänge, z. B.:
- Datenupload oder -download
- Sicherungs- und Wiederherstellungsvorgänge
- Import- oder Exportvorgänge
- Daten abrufen
- Lokale Dateiverarbeitung
- Daten über ein Netzwerk zwischen einem Gerät und der Cloud übertragen
- Alternativen
Ausführliche Informationen finden Sie unter Alternativen zu Diensten im Vordergrund für die Datensynchronisierung.
Zustand
- Foreground service type to declare in manifest under
android:foregroundServiceTypehealth- Permission to declare in your manifest
FOREGROUND_SERVICE_HEALTH- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_HEALTH- Runtime prerequisites
At least one of the following conditions must be true:
Declare the
HIGH_SAMPLING_RATE_SENSORSpermission in your manifest.Request and be granted at least one of the following runtime permissions:
BODY_SENSORSon API level 35 and lowerREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
Note: The
BODY_SENSORSand sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create ahealthforeground service that uses body sensors while your app is in the background unless you've been granted theBODY_SENSORS_BACKGROUND(API level 33 to 35) orREAD_HEALTH_DATA_IN_BACKGROUND(API level 36 and higher) permissions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Any long-running use cases to support apps in the fitness category such as exercise trackers.
Standort
- Foreground service type to declare in manifest under
android:foregroundServiceTypelocation- Permission to declare in your manifest
FOREGROUND_SERVICE_LOCATION- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_LOCATION- Runtime prerequisites
The user must have enabled location services and the app must be granted at least one of the following runtime permissions:
Note: In order to check that the user has enabled location services as well as granted access to the runtime permissions, use
PermissionChecker#checkSelfPermission()Note: The location runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a
locationforeground service while your app is in the background, unless you've been granted theACCESS_BACKGROUND_LOCATIONruntime permission. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Long-running use cases that require location access, such as navigation and location sharing.
- Alternatives
If your app needs to be triggered when the user reaches specific locations, consider using the geofence API instead.
Medien
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypemediaPlayback- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_MEDIA_PLAYBACK- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- Laufzeitvoraussetzungen
- Keine
- Beschreibung
- Audio- oder Videowiedergabe im Hintergrund fortsetzen. Unterstützung der Funktion „Digitaler Videorekorder“ (DVR) auf Android TV.
- Alternativen
- Wenn Sie ein Bild-im-Bild-Video anzeigen, verwenden Sie den Bild-im-Bild-Modus.
Medienprojektion
- Foreground service type to declare in manifest under
android:foregroundServiceTypemediaProjection- Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- Runtime prerequisites
Call the
createScreenCaptureIntent()method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.After you have created the foreground service, you can call
MediaProjectionManager.getMediaProjection().- Description
Project content to non-primary display or external device using the
MediaProjectionAPIs. This content doesn't have to be exclusively media content.- Alternatives
To stream media to another device, use the Google Cast SDK.
Mikrofon
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypemicrophone- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_MICROPHONE- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_MICROPHONE- Laufzeitvoraussetzungen
Fordern Sie die Laufzeitberechtigung
RECORD_AUDIOan und erhalten Sie sie.Hinweis:Die Laufzeitberechtigung
RECORD_AUDIOunterliegt Einschränkungen bei der Nutzung. Aus diesem Grund können Sie mit wenigen Ausnahmen keinenmicrophone-Dienst im Vordergrund erstellen, während sich Ihre App im Hintergrund befindet. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind.- Beschreibung
Mikrofonaufzeichnung im Hintergrund fortsetzen, z. B. bei Sprachrekordern oder Kommunikations-Apps
Telefonanruf
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypephoneCall- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_PHONE_CALL- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_PHONE_CALL- Laufzeitvoraussetzungen
Mindestens eine der folgenden Bedingungen muss erfüllt sein:
- Die App hat die Berechtigung
MANAGE_OWN_CALLSin ihrer Manifestdatei deklariert.
- Die App hat die Berechtigung
- Die App ist die Standard-App fürs Telefonieren über die Rolle
ROLE_DIALER.
- Die App ist die Standard-App fürs Telefonieren über die Rolle
- Beschreibung
Fortsetzen eines laufenden Anrufs mithilfe der
ConnectionServiceAPIs- Alternativen
Wenn Sie Telefon-, Video- oder VoIP-Anrufe starten möchten, können Sie die
android.telecom-Bibliothek verwenden.Sie können
CallScreeningServiceverwenden, um Anrufe zu filtern.
Remote-Messaging
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTyperemoteMessaging- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_REMOTE_MESSAGING- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- Laufzeitvoraussetzungen
- Keine
- Beschreibung
- Sie können Nachrichten von einem Gerät auf ein anderes übertragen. Unterstützt Nutzer beim Wechseln des Geräts, ohne dass die Messaging-Aufgaben weiter ausgeführt werden.
Kurze Verbindung
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypeshortService- Berechtigung, die in Ihrem Manifest deklariert werden muss
- Keine
- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Laufzeitvoraussetzungen
- Keine
- Beschreibung
Sie können wichtige Aufgaben, die nicht unterbrochen oder verschoben werden können, schnell erledigen.
Dieser Typ hat einige einzigartige Eigenschaften:
- Kann nur für einen kurzen Zeitraum (ca. 3 Minuten) ausgeführt werden.
- Keine Unterstützung für persistente Dienste im Vordergrund.
- Andere Dienste im Vordergrund können nicht gestartet werden.
- Erfordert keine typspezifische Berechtigung, aber die Berechtigung
FOREGROUND_SERVICE. - Ein
shortServicekann nur zu einem anderen Diensttyp wechseln, wenn die App derzeit berechtigt ist, einen neuen Dienst im Vordergrund zu starten. - Ein Dienst im Vordergrund kann seinen Typ jederzeit in
shortServiceändern. Ab diesem Zeitpunkt beginnt die Zeitüberschreitung.
Das Zeitlimit für shortService beginnt, sobald
Service.startForeground()aufgerufen wird. Die App sollteService.stopSelf()oderService.stopForeground()aufrufen, bevor die Zeitüberschreitung eintritt. Andernfalls wird der neueService.onTimeout()aufgerufen, wodurch Apps kurzzeitig die Möglichkeit haben,stopSelf()oderstopForeground()aufzurufen, um ihren Dienst zu beenden.Kurz nach dem Aufruf von
Service.onTimeout()wechselt die App in den Cache-Status und wird nicht mehr als App im Vordergrund betrachtet, es sei denn, der Nutzer interagiert aktiv mit der App. Kurz nachdem die App im Cache gespeichert wurde und der Dienst nicht beendet wurde, erhält die App eine ANR. In der ANR-Nachricht wirdFOREGROUND_SERVICE_TYPE_SHORT_SERVICEerwähnt. Aus diesen Gründen wird empfohlen, denService.onTimeout()-Callback zu implementieren.Der
Service.onTimeout()-Callback ist unter Android 13 und niedriger nicht vorhanden. Wenn derselbe Dienst auf solchen Geräten ausgeführt wird, erhält er weder ein Zeitlimit noch eine ANR. Der Dienst muss beendet werden, sobald die Verarbeitungsaufgabe abgeschlossen ist, auch wenn derService.onTimeout()-Callback noch nicht empfangen wurde.Wenn das Zeitlimit der
shortServicenicht eingehalten wird, wird für die App ein ANR ausgegeben, auch wenn andere gültige Dienste im Vordergrund oder andere App-Lebenszyklus-Prozesse ausgeführt werden.Wenn eine App für den Nutzer sichtbar ist oder eine der Ausnahmen erfüllt, die es ermöglichen, Dienste im Vordergrund aus dem Hintergrund zu starten, wird die Zeitüberschreitung durch einen erneuten Aufruf von
Service.StartForeground()mit dem ParameterFOREGROUND_SERVICE_TYPE_SHORT_SERVICEum weitere drei Minuten verlängert. Wenn die App für den Nutzer nicht sichtbar ist und keinen der Ausnahmen erfüllt, führt jeder Versuch, einen weiteren Dienst im Vordergrund zu starten, unabhängig vom Typ, zu einerForegroundServiceStartNotAllowedException.Wenn ein Nutzer die Akku-Optimierung für Ihre App deaktiviert, ist sie weiterhin vom Zeitlimit für shortService-FGS betroffen.
Wenn Sie einen Dienst im Vordergrund starten, der den Typ
shortServiceund einen anderen Typ von Dienst im Vordergrund enthält, wird die Deklaration des TypsshortServicevom System ignoriert. Der Dienst muss jedoch weiterhin die Voraussetzungen der anderen angegebenen Typen erfüllen. Weitere Informationen finden Sie in der Dokumentation zu Diensten im Vordergrund.
Spezielle Anwendungsfälle
- Typ des Diensts im Vordergrund, der im Manifest unter
android:foregroundServiceTypespecialUse- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_SPECIAL_USE- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_SPECIAL_USE- Laufzeitvoraussetzungen
- Keine
- Beschreibung
Deckt alle gültigen Anwendungsfälle für Dienste im Vordergrund ab, die nicht von den anderen Typen abgedeckt werden.
Neben der Deklarierung des
FOREGROUND_SERVICE_TYPE_SPECIAL_USETyps von Diensten im Vordergrund sollten Entwickler Anwendungsfälle im Manifest deklarieren. Dazu geben sie das<property>-Element innerhalb des Elements<service>an. Diese Werte und die entsprechenden Anwendungsfälle werden geprüft, wenn Sie Ihre App in der Google Play Console einreichen. Die von Ihnen angegebenen Anwendungsfälle sind kostenlos formuliert. Sie sollten jedoch genügend Informationen angeben, damit die Prüfer nachvollziehen können, warum Sie denspecialUse-Typ verwenden müssen.<service android:name="fooService" android:foregroundServiceType="specialUse"> <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="explanation_for_special_use"/> </service>
Vom System ausgenommen
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypesystemExempted- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- Laufzeitvoraussetzungen
- Keine
- Beschreibung
Reserviert für Systemanwendungen und bestimmte Systemintegrationen, um Dienste im Vordergrund weiterhin zu verwenden.
Damit dieser Typ verwendet werden kann, muss eine App mindestens eines der folgenden Kriterien erfüllen:
- Das Gerät befindet sich im Demomodus
- Die App ist ein Geräteeigentümer
- Die App ist ein Inhaber des Profilers
- Sicherheits-Apps mit der Rolle
ROLE_EMERGENCY - Apps zur Geräteverwaltung
- Apps, die die Berechtigung
SCHEDULE_EXACT_ALARModerUSE_EXACT_ALARMhaben und Dienste im Vordergrund verwenden, um Wecker im Hintergrund fortzusetzen, einschließlich Weckern, die nur haptisches Feedback geben. VPN-Apps (konfiguriert über Einstellungen > Netzwerk und Internet > VPN)
Andernfalls löst die Deklaration dieses Typs eine
ForegroundServiceTypeNotAllowedExceptionaus.
Google Play-Richtlinienerzwingung für die Verwendung von Typen von Diensten im Vordergrund
Wenn Ihre App auf Android 14 oder höher ausgerichtet ist, müssen Sie die Typen der Dienste im Vordergrund Ihrer App auf der Seite „App-Inhalte“ in der Play Console (Richtlinie > App-Inhalte) deklarieren. Weitere Informationen dazu, wie Sie die Typen Ihrer Dienste im Vordergrund in der Play Console deklarieren, finden Sie unter Anforderungen für Dienste im Vordergrund und Full-Screen Intents.