Apps, die auf Android 12 (API-Level 31) oder höher ausgerichtet sind, können keine Dienste im Vordergrund
starten, während die App im Hintergrund ausgeführt wird. Es gibt jedoch einige Ausnahmen. Wenn eine App versucht, einen
Dienst im Vordergrund zu starten, während sie im Hintergrund ausgeführt wird, und der Dienst im Vordergrund nicht unter eine der Ausnahmen fällt, löst das System eine
ForegroundServiceStartNotAllowedException aus.
Wenn eine App außerdem einen Dienst im Vordergrund starten möchte, für den Berechtigungen für die Nutzung während der Verwendung erforderlich sind (z. B. Berechtigungen für Körpersensoren, Kamera, Mikrofon oder Standort), kann sie den Dienst nicht erstellen , während die App im Hintergrund ausgeführt wird. Das gilt auch dann, wenn die App unter eine der Ausnahmen von den Einschränkungen für den Start im Hintergrund fällt. Der Grund dafür wird im Abschnitt Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung während der Verwendung erforderlich sind erläutert.
Ausnahmen von den Einschränkungen für den Start im Hintergrund
In den folgenden Situationen kann Ihre App Dienste im Vordergrund starten, auch wenn sie im Hintergrund ausgeführt wird:
- Ihre App wechselt aus einem für den Nutzer sichtbaren Zustand, z. B. einer Aktivität.
- Ihre App kann eine Aktivität im Hintergrund starten. Das gilt nicht, wenn sich im Back-Stack einer vorhandenen Aufgabe eine Aktivität der App befindet.
Ihre App empfängt eine Nachricht mit hoher Priorität über Firebase Cloud Messaging.
Der Nutzer führt eine Aktion für ein UI-Element aus, das mit Ihrer App verknüpft ist. Er kann beispielsweise mit einer Blase, Benachrichtigung, einem Widget oder einer Aktivität interagieren.
Ihre App ruft einen exakten Alarm auf, um eine vom Nutzer angeforderte Aktion auszuführen.
Ihre App ist die aktuelle Eingabemethode des Geräts.
Ihre App empfängt ein Ereignis, das mit einem Übergang bei der Geofencing oder Aktivitätserkennung zusammenhängt.
Nachdem das Gerät neu gestartet wurde und die
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETED, oderACTION_MY_PACKAGE_REPLACEDIntent-Aktion in einem Übertragungsempfängerempfangen hat.Ihre App empfängt die
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGED, oderACTION_LOCALE_CHANGEDIntent-Aktion in einem Übertragungsempfänger.Ihre App empfängt das
ACTION_TRANSACTION_DETECTEDEreignis vonNfcService.Apps mit bestimmten Systemrollen oder Berechtigungen, z. B. Geräte inhaber und Profil inhaber.
Ihre App verwendet den Companion Device Manager und deklariert die
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDBerechtigung oder dieREQUEST_COMPANION_RUN_IN_BACKGROUNDBerechtigung. Verwenden Sie nach MöglichkeitREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.Der Nutzer deaktiviert die Akkuoptimierung für Ihre App.
Ihre App hat die
SYSTEM_ALERT_WINDOWBerechtigung. Hinweis: Wenn Ihre App auf Android 15 oder höher ausgerichtet ist, muss sie die BerechtigungSYSTEM_ALERT_WINDOWhaben und die App muss derzeit ein sichtbares Overlay-Fenster haben.
Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung während der Verwendung erforderlich sind
Unter Android 14 (API-Level 34) oder höher gibt es besondere Situationen, die Sie beachten müssen, wenn Sie einen Dienst im Vordergrund starten, für den Berechtigungen für die Nutzung während der Verwendung erforderlich sind.
Wenn Ihre App auf Android 14 oder höher ausgerichtet ist, prüft das Betriebssystem beim Erstellen eines Dienstes im Vordergrund, ob Ihre App alle entsprechenden Berechtigungen für diesen Diensttyp hat. Wenn Sie beispielsweise einen
Dienst im Vordergrund vom Typ
Mikrofon erstellen, prüft das Betriebssystem, ob Ihre App derzeit die
RECORD_AUDIO
Berechtigung hat. Wenn Sie diese Berechtigung nicht haben, löst das System eine
SecurityException aus.
Bei Berechtigungen für die Nutzung während der Verwendung kann dies zu einem Problem führen. Wenn Ihre App eine
Berechtigung für die Nutzung während der Verwendung hat, hat sie diese Berechtigung nur während sie im
Vordergrund ausgeführt wird. Wenn Ihre App also im Hintergrund ausgeführt wird und versucht, einen Dienst im Vordergrund vom Typ „Kamera“, „Standort“ oder „Mikrofon“ zu erstellen, stellt das System fest, dass Ihre App derzeit nicht die erforderlichen Berechtigungen hat, und löst eine SecurityException aus.
Wenn Ihre App im Hintergrund ausgeführt wird und einen Gesundheitsdienst erstellt, für den die Berechtigung BODY_SENSORS erforderlich ist, hat die App diese Berechtigung derzeit nicht und das System löst eine Ausnahme aus.
Das gilt nicht, wenn es sich um einen Gesundheitsdienst handelt, für den andere Berechtigungen erforderlich sind,
wie ACTIVITY_RECOGNITION.) Der Aufruf von
PermissionChecker.checkSelfPermission()
verhindert dieses Problem nicht. Wenn Ihre App eine Berechtigung für die Nutzung während der Verwendung hat und checkSelfPermission() aufruft, um zu prüfen, ob sie diese Berechtigung hat, gibt die Methode PERMISSION_GRANTED zurück, auch wenn die App im Hintergrund ausgeführt wird. Wenn die Methode PERMISSION_GRANTED zurückgibt, bedeutet das: „Ihre App hat diese Berechtigung während der Nutzung der App“.
Wenn Ihr Dienst im Vordergrund also eine Berechtigung für die Nutzung während der Verwendung benötigt, müssen Sie Context.startForegroundService() oder Context.bindService() aufrufen, während Ihre App eine sichtbare Aktivität hat. Das gilt nicht, wenn der Dienst unter eine der definierten Ausnahmen fällt.
Ausnahmen von den Einschränkungen für Berechtigungen für die Nutzung während der Verwendung
In einigen Situationen kann ein Dienst im Vordergrund, auch wenn er gestartet wird, während die App ausgeführt wird im Hintergrund, auf Standort-, Kamera- und Mikrofoninformationen zugreifen, während die App im Vordergrund ausgeführt wird ("während der Verwendung").
Wenn der Dienst in diesen Situationen einen Diensttyp im Vordergrund vom Typ location deklariert und von einer App gestartet wird, die die Berechtigung ACCESS_BACKGROUND_LOCATION hat, kann dieser Dienst jederzeit auf Standortinformationen zugreifen, auch wenn die App im Hintergrund ausgeführt wird.
Die folgenden Situationen sind möglich:
- Eine Systemkomponente startet den Dienst.
- Der Dienst wird durch Interaktion mit App -Widgets gestartet.
- Der Dienst wird durch Interaktion mit einer Benachrichtigung gestartet.
- Der Dienst wird als
PendingIntentgestartet, das von einer anderen sichtbaren App gesendet wird. - Der Dienst wird von einer App gestartet, die ein Device Policy Controller ist und im Modus „Geräteeigentümer“ ausgeführt wird.
- Der Dienst wird von einer App gestartet, die den
VoiceInteractionServicebereitstellt. - Der Dienst wird von einer App gestartet, die die Berechtigung
START_ACTIVITIES_FROM_BACKGROUNDhat.
Ermitteln, welche Dienste in Ihrer App betroffen sind
Starten Sie beim Testen Ihrer App die Dienste im Vordergrund. Wenn ein gestarteter Dienst eingeschränkten Zugriff auf Standort, Mikrofon und Kamera hat, wird in Logcat die folgende Meldung angezeigt:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME