Einschränkungen für das Starten von Aktivitäten im Hintergrund

Android 10 (API-Level 29) und höher schränken ein, wann Apps Aktivitäten starten können, wenn sie im Hintergrund ausgeführt werden. Diese Einschränkungen tragen dazu bei, Unterbrechungen für den Nutzer zu minimieren und ihm mehr Kontrolle darüber zu geben, was auf seinem Bildschirm angezeigt wird.

In diesem Leitfaden werden Benachrichtigungen als Alternative zum Starten von Aktivitäten im Hintergrund vorgestellt. Außerdem sind die konkreten Fälle aufgeführt, in denen die Einschränkung nicht gilt.

Stattdessen Benachrichtigungen anzeigen

In beinahe allen Fällen müssen Apps im Hintergrund zeitkritische Benachrichtigungen anzeigen, um dem Nutzer dringende Informationen zu liefern, anstatt eine Aktivität direkt zu starten. Zu diesen Benachrichtigungen gehören die Verarbeitung eines eingehenden Telefonanrufs oder einer aktiven Wecker.

Dieses benachrichtigungsbasierte Benachrichtigungs- und Erinnerungssystem bietet Nutzern mehrere Vorteile:

  • Wenn der Nutzer das Gerät verwendet, wird eine Vorabbenachrichtigung angezeigt, mit der er antworten kann. Der Nutzer behält seinen aktuellen Kontext und hat Kontrolle über den Inhalt, den er auf dem Bildschirm sieht.
  • Zeitkritische Benachrichtigungen berücksichtigen die Bitte nicht stören-Regeln des Nutzers. So können Nutzer beispielsweise nur Anrufe von bestimmten Kontakten oder von wiederholten Anrufen zulassen, wenn „Bitte nicht stören“ aktiviert ist.
  • Wenn der Bildschirm des Geräts ausgeschaltet ist, wird der Full-Screen Intent sofort gestartet.
  • Auf dem Bildschirm Einstellungen des Geräts kann der Nutzer sehen, von welchen Apps kürzlich Benachrichtigungen gesendet wurden, einschließlich bestimmter Benachrichtigungskanäle. Über diesen Bildschirm kann der Nutzer seine Benachrichtigungseinstellungen festlegen.

Wann Apps Aktivitäten starten können

Apps, die unter Android 10 oder höher ausgeführt werden, können Aktivitäten starten, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

  • Die App hat ein sichtbares Fenster, z. B. eine Aktivität im Vordergrund.
  • Die App hat eine Aktivität im Back-Stack der Aufgabe im Vordergrund.
  • Die App enthält im Back-Stack einer vorhandenen Aufgabe auf dem Bildschirm „Zuletzt“ eine Aktivität.

  • Die App hat eine erst vor Kurzem gestartete Aktivität.

  • Die App finish() für eine Aktivität wurde vor Kurzem ausgeführt. Dies gilt nur, wenn die App beim Aufruf von finish() entweder eine Aktivität im Vordergrund oder eine Aktivität im Back-Stack der Aufgabe im Vordergrund hatte.

  • Die App hat einen der folgenden Dienste, der an das System gebunden ist. Diese Dienste müssen möglicherweise eine UI starten.

  • Die Anwendung hat einen Dienst, der an eine andere, sichtbare Anwendung gebunden ist. Die an den Dienst gebundene Anwendung muss sichtbar bleiben, damit die Anwendung im Hintergrund Aktivitäten erfolgreich starten kann.

  • Die App erhält eine Benachrichtigung PendingIntent vom System. Bei ausstehenden Intents für Dienste und Broadcast-Empfänger kann die App für einige Sekunden Aktivitäten starten, nachdem der ausstehende Intent gesendet wurde.

  • Die Anwendung empfängt ein PendingIntent, das von einer anderen, sichtbaren Anwendung gesendet wird.

  • Die App empfängt einen System-Broadcast, bei dem die App voraussichtlich eine UI starten wird. Beispiele hierfür sind ACTION_NEW_OUTGOING_CALL und SECRET_CODE_ACTION. Die App kann nach dem Senden der Nachricht noch einige Sekunden lang Aktivitäten starten.

  • Die App ist über die CompanionDeviceManager API mit einem Companion-Hardwaregerät verknüpft. Mit dieser API kann die App Aktivitäten als Reaktion auf Aktionen starten, die der Nutzer auf einem gekoppelten Gerät ausführt.

  • Die App ist ein Device Policy Controller, der im Modus „Geräteeigentümer“ ausgeführt wird. Beispielanwendungsfälle sind unter anderem vollständig verwaltete Unternehmensgeräte sowie dedizierte Geräte wie digitale Beschilderung und Kioske.

  • Der Nutzer hat der App die Berechtigung SYSTEM_ALERT_WINDOW gewährt.

Beim Starten von Aktivitäten von PendingIntents ist eine Zustimmung erforderlich

Um versehentliche Aktivitätsstarts auf Grundlage der aufgeführten Bedingungen zu vermeiden, gibt es ab Android 14 explizite APIs, mit denen du einer App Berechtigungen für Aktivitätsstarts aktivieren oder deaktivieren kannst.

Siehe:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

Vom Absender des PendingIntent

Apps, die auf Android 14 oder höher ausgerichtet sind und ein PendingIntent starten möchten, müssen

  • die aufgeführten Bedingungen erfüllen und
  • dem Aktivieren der Aktivierung von Hintergrundaktivitäten auf der Grundlage dieser Ausnahmen zustimmen

Diese Aktivierung sollte nur dann erfolgen, wenn der App-Entwickler weiß, dass die App gerade eine Aktivität starten wird.

Zum Aktivieren muss die App ein ActivityOptions-Bundle mit setPendingIntentBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) an PendingIntent.send(...) oder ähnliche Methoden übergeben.

Vom Ersteller des PendingIntent

Apps, die auf Android 15 oder höher ausgerichtet sind und ein PendingIntent erstellen, müssen

  • die aufgeführten Bedingungen erfüllen und
  • dem Aktivieren der Aktivierung von Hintergrundaktivitäten auf der Grundlage dieser Ausnahmen zustimmen

In den meisten Fällen sollte die App, die den PendingIntent startet, diejenige sein, die aktiviert werden muss.

Wenn die App, die die PendingIntent erstellt, aktiviert, geschieht Folgendes:

  • PendingIntent kann jederzeit gestartet werden, wenn die erstellende App sichtbar ist
  • Das PendingIntent kann jederzeit gestartet werden, wenn die erstellende Anwendung besondere Berechtigungen hat.

Es wird daher empfohlen, ein solches PendingIntent-Objekt nicht an eine vertrauenswürdige Anwendung zu übergeben und PendingIntent abzubrechen, wenn es nicht mehr verwendet werden soll.

Zum Aktivieren muss die App ein ActivityOptions-Bundle mit setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) an PendingIntent.getActivity(...) oder ähnliche Methoden übergeben.