Arten von Diensten im Vordergrund sind erforderlich

为了帮助开发者更有目的地定义面向用户的前台服务,Android 10 在 <service> 元素内引入了 android:foregroundServiceType 属性。

如果您的应用以 Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。下面列出了可供选择的前台服务类型:

如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 WorkManager用户发起的数据传输作业

Android 14 中新增了 health, remoteMessaging, shortService, specialUsesystemExempted 类型。

以下代码段提供了一个清单中的前台服务类型声明示例:

<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>

如果以 Android 14 为目标平台的应用未在清单中定义给定服务的类型,系统会在调用 startForeground() 时引发 MissingForegroundServiceTypeException

Neue Berechtigung für die Verwendung von Diensten im Vordergrund erklären

如果以 Android 14 为目标平台的应用使用前台服务,则必须根据前台服务类型声明 Android 14 中引入的特定权限。这些权限显示在本页每种前台服务类型的预期用例和强制执行部分中标记为“您必须在清单文件中声明的权限”的部分。

所有这些权限都定义为一般权限,并默认授予。用户无法撤消这些权限。

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

要在 android:foregroundServiceType 下在清单中声明的前台服务类型
camera
在清单中声明的权限
FOREGROUND_SERVICE_CAMERA
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_CAMERA
运行时前提条件

请求并获得 CAMERA 运行时权限

注意CAMERA 运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建 camera 前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制

说明

继续在后台访问相机,例如支持多任务的视频聊天应用。

Verbundenes Gerät

Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceType
connectedDevice
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:

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:foregroundServiceType
dataSync
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

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
health
在清单中声明的权限
FOREGROUND_SERVICE_HEALTH
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_HEALTH
运行时前提条件

必须至少满足以下其中一个条件:

注意BODY_SENSORS 和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得 BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或 READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的 health 前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制

说明

为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。

Standort

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
location
在清单中声明的权限
FOREGROUND_SERVICE_LOCATION
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_LOCATION
运行时前提条件

用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:

注意:如需检查用户是否已启用位置信息服务以及是否已授予对运行时权限的访问权限,请使用 PermissionChecker#checkSelfPermission()

注意:位置信息运行时权限受“使用期间”限制。因此,除非您已获得 ACCESS_BACKGROUND_LOCATION 运行时权限,否则无法在应用在后台运行时创建 location 前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制

说明

需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。

替代方案

如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API

Medien

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
mediaPlayback
在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PLAYBACK
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
运行时前提条件
说明
在后台继续播放音频或视频。在 Android TV 上支持数字视频录制 (DVR) 功能。
替代方案
如果您要显示画中画视频,请使用画中画模式

Medienprojektion

Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceType
mediaProjection
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 MediaProjection APIs 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:foregroundServiceType
microphone
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_AUDIO an und erhalten Sie sie.

Hinweis:Die Laufzeitberechtigung RECORD_AUDIO unterliegt Einschränkungen bei der Nutzung. Aus diesem Grund können Sie mit wenigen Ausnahmen keinen microphone-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

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
phoneCall
在清单中声明的权限
FOREGROUND_SERVICE_PHONE_CALL
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_PHONE_CALL
运行时前提条件

必须至少满足以下其中一个条件:

  • 应用是通过 ROLE_DIALER 角色的默认拨号器应用。
说明

使用 ConnectionService API 继续当前通话。

替代方案

如果您需要拨打电话、视频通话或 VoIP 通话,不妨考虑使用 android.telecom 库。

考虑使用 CallScreeningService 来过滤来电。

Remote-Messaging

Typ des Dienstes im Vordergrund, der im Manifest unter
android:foregroundServiceType
remoteMessaging
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:foregroundServiceType
shortService
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 shortService kann 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 sollte Service.stopSelf() oder Service.stopForeground() aufrufen, bevor die Zeitüberschreitung eintritt. Andernfalls wird der neue Service.onTimeout() aufgerufen, wodurch Apps kurzzeitig die Möglichkeit haben, stopSelf() oder stopForeground() 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 wird FOREGROUND_SERVICE_TYPE_SHORT_SERVICE erwähnt. Aus diesen Gründen wird empfohlen, den Service.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 der Service.onTimeout()-Callback noch nicht empfangen wurde.

Wenn das Zeitlimit der shortService nicht 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 Parameter FOREGROUND_SERVICE_TYPE_SHORT_SERVICE um 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 einer ForegroundServiceStartNotAllowedException.

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 shortService und einen anderen Typ von Dienst im Vordergrund enthält, wird die Deklaration des Typs shortService vom 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

要在清单中声明的前台服务类型
android:foregroundServiceType
specialUse
在清单中声明的权限
FOREGROUND_SERVICE_SPECIAL_USE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
运行时前提条件
说明

涵盖其他前台服务类型未涵盖的所有有效前台服务用例。

除了声明 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在 <service> 元素内指定 <property> 元素。这些值和相应的应用场景 。用途 您提供的案例均为自由形式,因此,您应确保提供足够的 相关信息,让审核人员了解您为何需要使用 specialUse 类型。

<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

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
systemExempted
在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
运行时前提条件
说明

为系统应用和特定系统集成预留,使其能继续使用前台服务。

如需使用此类型,应用必须至少满足以下条件之一:

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.