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
- Foreground service type to declare in manifest under
android:foregroundServiceTypeconnectedDevice- Permission to declare in your manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- Runtime prerequisites
At least one of the following conditions must be true:
Declare at least one of the following permissions in your manifest:
Request and be granted at least one of the following runtime permissions:
- Description
Interactions with external devices that require a Bluetooth, NFC, IR, USB, or network connection.
- Alternatives
If your app needs to do continuous data transfer to an external device, consider using the companion device manager instead. Use the companion device presence API to help your app stay running while the companion device is in range.
If your app needs to scan for bluetooth devices, consider using the Bluetooth scan API instead.
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
- Typ des Diensts im Vordergrund, der im Manifest unter
android:foregroundServiceTypehealth- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_HEALTH- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_HEALTH- Laufzeitvoraussetzungen
Mindestens eine der folgenden Bedingungen muss erfüllt sein:
Deklarieren Sie die Berechtigung
HIGH_SAMPLING_RATE_SENSORSin Ihrem Manifest.Sie müssen mindestens eine der folgenden Laufzeitberechtigungen anfordern und erhalten:
BODY_SENSORSauf API-Ebene 35 und niedrigerREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
Hinweis:Die Laufzeitberechtigungen
BODY_SENSORSund die sensorbasierten LESE-Berechtigungen unterliegen Einschränkungen bei der Verwendung. Aus diesem Grund können Sie nur dann einenhealth-Dienst im Vordergrund erstellen, der Körpersensoren verwendet, während Ihre App im Hintergrund ausgeführt wird, wenn Sie die BerechtigungenBODY_SENSORS_BACKGROUND(API-Level 33 bis 35) oderREAD_HEALTH_DATA_IN_BACKGROUND(API-Level 36 und höher) haben. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind.- Beschreibung
Alle lang laufenden Anwendungsfälle zur Unterstützung von Apps in der Kategorie „Fitness“, z. B. Trainings-Tracker.
Standort
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypelocation- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_LOCATION- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_LOCATION- Laufzeitvoraussetzungen
Der Nutzer muss die Standortdienste aktiviert haben und der App muss mindestens eine der folgenden Laufzeitberechtigungen gewährt werden:
Hinweis:Mit
PermissionChecker#checkSelfPermission()können Sie prüfen, ob der Nutzer die Standortdienste aktiviert und Zugriff auf die Laufzeitberechtigungen gewährt hat.Hinweis:Die Laufzeitberechtigungen für die Standortermittlung unterliegen Einschränkungen bei der Verwendung. Aus diesem Grund können Sie keinen
location-Dienst im Vordergrund erstellen, während sich Ihre App im Hintergrund befindet, es sei denn, Sie haben die LaufzeitberechtigungACCESS_BACKGROUND_LOCATIONerhalten. Weitere Informationen finden Sie unter Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind.- Beschreibung
Langlaufende Anwendungsfälle, für die der Standortzugriff erforderlich ist, z. B. Navigation und Standortfreigabe.
- Alternativen
Wenn Ihre App ausgelöst werden soll, wenn der Nutzer bestimmte Orte erreicht, sollten Sie stattdessen die Geofence API verwenden.
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
- Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceTypemediaProjection- Berechtigung, die in Ihrem Manifest deklariert werden muss
FOREGROUND_SERVICE_MEDIA_PROJECTION- Konstante, die an
startForeground()übergeben werden soll FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- Laufzeitvoraussetzungen
Rufen Sie die Methode
createScreenCaptureIntent()auf, bevor Sie den Dienst im Vordergrund starten. Daraufhin wird dem Nutzer eine Berechtigungsbenachrichtigung angezeigt. Der Nutzer muss die Berechtigung erteilen, bevor Sie den Dienst erstellen können.Nachdem Sie den Dienst im Vordergrund erstellt haben, können Sie
MediaProjectionManager.getMediaProjection()aufrufen.- Beschreibung
Übertragung von Inhalten mit
MediaProjectionAPIs auf nicht primäre Displays oder externe Geräte. Diese Inhalte müssen nicht ausschließlich Medieninhalte sein.- Alternativen
Wenn Sie Medien auf ein anderes Gerät streamen möchten, verwenden Sie das 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
- Foreground service type to declare in manifest under
android:foregroundServiceTypeshortService- Permission to declare in your manifest
- None
- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Runtime prerequisites
- None
- Description
Quickly finish critical work that cannot be interrupted or postponed.
This type has some unique characteristics:
- Can only run for a short period of time (about 3 minutes).
- No support for sticky foreground services.
- Cannot start other foreground services.
- Doesn't require a type-specific permission, though it still
requires the
FOREGROUND_SERVICEpermission. - A
shortServicecan only change to another service type if the app is currently eligible to start a new foreground service. - A foreground service can change its type to
shortServiceat any time, at which point the timeout period begins.
The timeout for shortService begins from the moment that
Service.startForeground()is called. The app is expected to callService.stopSelf()orService.stopForeground()before the timeout occurs. Otherwise, the newService.onTimeout()is called, giving apps a brief opportunity to callstopSelf()orstopForeground()to stop their service.A short time after
Service.onTimeout()is called, the app enters a cached state and is no longer considered to be in the foreground, unless the user is actively interacting with the app. A short time after the app is cached and the service has not stopped, the app receives an ANR. The ANR message mentionsFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. For these reasons, it's considered best practice to implement theService.onTimeout()callback.The
Service.onTimeout()callback doesn't exist on Android 13 and lower. If the same service runs on such devices, it doesn't receive a timeout, nor does it ANR. Make sure that your service stops as soon as it finishes the processing task, even if it hasn't received theService.onTimeout()callback yet.It's important to note that if the timeout of the
shortServiceis not respected, the app will ANR even if it has other valid foreground services or other app lifecycle processes running.If an app is visible to the user or satisfies one of the exemptions that allow foreground services to be started from the background, calling
Service.StartForeground()again with theFOREGROUND_SERVICE_TYPE_SHORT_SERVICEparameter extends the timeout by another 3 minutes. If the app isn't visible to the user and doesn't satisfy one of the exemptions, any attempt to start another foreground service, regardless of type, causes aForegroundServiceStartNotAllowedException.If a user disables battery optimization for your app, it's still affected by the timeout of shortService FGS.
If you start a foreground service that includes the
shortServicetype and another foreground service type, the system ignores theshortServicetype declaration. However, the service must still adhere to the prerequisites of the other declared types. For more information, see the Foreground services documentation.
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.