Einschränkungen beim Starten eines Diensts im Vordergrund aus dem Hintergrund

Bei Apps, die auf Android 12 (API-Level 31) oder höher ausgerichtet sind, können Dienste im Vordergrund nicht gestartet werden, während die App im Hintergrund ausgeführt wird, mit wenigen Ausnahmen. Wenn eine App versucht, einen Dienst im Vordergrund zu starten, während sie im Hintergrund ausgeführt wird, und der Dienst im Vordergrund keinen der Ausnahmefälle erfüllt, löst das System eine ForegroundServiceStartNotAllowedException aus.

Wenn eine App außerdem einen Dienst im Vordergrund starten möchte, für den Berechtigungen zur Nutzung während der Verwendung erforderlich sind (z. B. Berechtigungen für Körpersensor, Kamera, Mikrofon oder Standort), kann der Dienst nicht erstellt werden, während die App im Hintergrund ausgeführt wird. Das gilt auch, wenn die App eine der Ausnahmen von den Einschränkungen beim Starten im Hintergrund erfüllt. Der Grund dafür wird im Abschnitt Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind erläutert.

Ausnahmen von Einschränkungen beim Start im Hintergrund

In den folgenden Fällen kann Ihre App Dienste im Vordergrund starten, auch wenn sie im Hintergrund ausgeführt wird:

Einschränkungen beim Starten von Diensten im Vordergrund, für die Berechtigungen für die Nutzung erforderlich sind

Unter Android 14 (API-Level 34) oder höher gibt es spezielle Situationen, die Sie beachten sollten, wenn Sie einen Dienst im Vordergrund starten, für den Berechtigungen für die Nutzung 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 erforderlichen 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 Berechtigung RECORD_AUDIO hat. Wenn Sie diese Berechtigung nicht haben, gibt das System die Fehlermeldung SecurityException aus.

Bei Berechtigungen, die nur während der Nutzung gelten, kann dies zu Problemen führen. Wenn Ihre App eine Berechtigung vom Typ „Während der Nutzung“ 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, erkennt das System, dass Ihre App derzeit nicht die erforderlichen Berechtigungen hat, und löst eine SecurityException aus.

Wenn Ihre App sich im Hintergrund befindet 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. Dies gilt nicht für Gesundheitsdienste, für die andere Berechtigungen erforderlich sind, z. B. ACTIVITY_RECOGNITION. Das Aufrufen 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 eine Berechtigung vom Typ „Während der Nutzung“ benötigt, müssen Sie Context.startForegroundService() oder Context.bindService() aufrufen, während in Ihrer App eine sichtbare Aktivität angezeigt wird, es sei denn, der Dienst fällt unter eine der definierten Ausnahmen.

Ausnahmen von Einschränkungen für Berechtigungen, die während der Nutzung aktiv sind

In einigen Fällen kann ein Dienst im Vordergrund auch dann auf Standort-, Kamera- und Mikrofoninformationen zugreifen, wenn die App im Hintergrund ausgeführt wird, während die App im Vordergrund ausgeführt wird („bei Verwendung“).

In diesen Fällen kann der Dienst, wenn er location als Typ des Diensts im Vordergrund deklariert und von einer App gestartet wird, die die Berechtigung ACCESS_BACKGROUND_LOCATION hat, jederzeit auf Standortinformationen zugreifen, auch wenn die App im Hintergrund ausgeführt wird.

Die folgende Liste enthält diese Situationen:

  • Eine Systemkomponente startet den Dienst.
  • Der Dienst beginnt mit der Interaktion mit App-Widgets.
  • Der Dienst beginnt mit der Interaktion mit einer Benachrichtigung.
  • Der Dienst beginnt als PendingIntent, die von einer anderen sichtbaren App gesendet wird.
  • Der Dienst wird von einer App gestartet, die ein Device Policy Controller ist und im Modus „Geräteinhaber“ ausgeführt wird.
  • Der Dienst wird von einer App gestartet, die die VoiceInteractionService bereitstellt.
  • Der Dienst wird von einer App gestartet, die die Berechtigung START_ACTIVITIES_FROM_BACKGROUND hat.

Ermitteln, welche Dienste in Ihrer App betroffen sind

Starten Sie beim Testen Ihrer App die Dienste im Vordergrund. Wenn ein gestarteter Dienst den Zugriff auf Standort, Mikrofon und Kamera eingeschränkt hat, wird in Logcat die folgende Meldung angezeigt:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME