为了帮助开发者更有目的地定义面向用户的前台服务,Android 10 在 <service> 元素内引入了 android:foregroundServiceType 属性。
如果您的应用以 Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。下面列出了可供选择的前台服务类型:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 WorkManager 或用户发起的数据传输作业。
Android 14 中新增了 health, remoteMessaging, shortService, specialUse 和 systemExempted 类型。
以下代码段提供了一个清单中的前台服务类型声明示例:
<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。
Zadeklaruj nowe uprawnienia do korzystania z typów usług na pierwszym planie
如果以 Android 14 为目标平台的应用使用前台服务,则必须根据前台服务类型声明 Android 14 中引入的特定权限。这些权限显示在本页每种前台服务类型的预期用例和强制执行部分中标记为“您必须在清单文件中声明的权限”的部分。
所有这些权限都定义为一般权限,并默认授予。用户无法撤消这些权限。
Uwzględnij typ usługi na pierwszym planie w czasie wykonywania
对于启动前台服务的应用,最佳实践是使用 startForeground() 的 ServiceCompat 版本(在 androidx-core 1.12 及更高版本中提供),并在其中传入前台服务类型的按位整数。您可以选择传递一个或多个类型值。
通常,您应仅声明特定用例所需的类型。这样可以更轻松地满足系统对每种前台服务类型的预期。如果某项前台服务以多种类型启动,则该前台服务必须遵守所有类型的平台强制执行要求。
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
如果在调用中未指定前台服务类型,则类型默认为清单中定义的值。如果您未在清单中指定服务类型,系统会抛出 MissingForegroundServiceTypeException。
如果前台服务在启动后需要新权限,您应再次调用 startForeground() 并添加新的服务类型。例如,假设一款健身应用运行一项始终需要 location 信息但可能不需要 media 权限的跑步跟踪器服务。您需要在清单中同时声明 location 和 mediaPlayback。如果用户开始跑步,只希望跟踪其位置信息,您的应用应调用 startForeground(),并仅传递 location 服务类型。然后,如果用户想开始播放音频,请再次调用 startForeground() 并传递 location|mediaPlayback。
Sprawdzanie systemu w czasie działania
系统会检查前台服务类型的使用是否恰当,并确认应用是否已请求适当的运行时权限或使用所需的 API。例如,系统希望使用前台服务类型 FOREGROUND_SERVICE_TYPE_LOCATION 的应用请求 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION。
这意味着,在向用户请求权限和启动前台服务时,应用必须遵循非常具体的操作顺序。应用在尝试调用 startForeground() 之前,必须先请求并获得所需的权限。在启动前台服务后请求相应权限的应用必须更改此顺序,并在启动前台服务之前请求该权限。
本页面的每种前台服务类型的预期用例和强制执行部分中标记为“运行时要求”的部分列出了平台强制执行的具体内容。
Zastosowania i sposoby egzekwowania zasad w przypadku każdego typu usługi na pierwszym planie
Aby używać danego typu usługi na pierwszym planie, musisz zadeklarować w pliku manifestu odpowiednie uprawnienie, spełnić określone wymagania dotyczące czasu wykonywania, a także dostosować aplikację do jednego z przewidywanych zestawów przypadków użycia dla tego typu. W następnych sekcjach opisujemy uprawnienia, które musisz zadeklarować, wymagania w czasie działania oraz przypadki użycia każdego typu.
Aparat
- Typ usługi na pierwszym planie do zadeklarowania w pliku manifestu w sekcji
android:foregroundServiceType camera- Uprawnienia do zadeklarowania w pliku manifestu
FOREGROUND_SERVICE_CAMERA- stała wartość przekazywana do
startForeground(), FOREGROUND_SERVICE_TYPE_CAMERA- Wymagania wstępne środowiska wykonawczego
Poproś o uprawnienia czasu działania
CAMERAi uzyskaj je.Uwaga: uprawnienie czasu działania
CAMERApodlega ograniczeniom podczas używania. Z tego powodu nie możesz utworzyć usługi na pierwszym planiecamera, gdy aplikacja działa w tle, z pewnymi wyjątkami. Więcej informacji znajdziesz w artykule Ograniczenia dotyczące uruchamiania usług na pierwszym planie, które wymagają uprawnień podczas korzystania.- Opis
Dalsze korzystanie w tle z aparatu, np. w przypadku aplikacji do obsługi czatu wideo, które umożliwiają wielozadaniowość.
Połączone urządzenie
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypeconnectedDevice- 在清单中声明的权限
FOREGROUND_SERVICE_CONNECTED_DEVICE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中至少声明以下其中一项权限:
至少请求并被授予以下其中一项运行时权限:
- 说明
与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。
- 替代方案
如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。
如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API。
Synchronizowanie danych
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypedataSync- 在清单中声明的权限
FOREGROUND_SERVICE_DATA_SYNC- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_DATA_SYNC- 运行时前提条件
- 无
- 说明
数据传输操作,例如:
- 数据上传或下载
- 备份和恢复操作
- 导入或导出操作
- 获取数据
- 本地文件处理
- 通过网络在设备和云端之间传输数据
- 替代方案
如需了解详情,请参阅数据同步前台服务的替代方案。
Stan
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypehealth- 在清单中声明的权限
FOREGROUND_SERVICE_HEALTH- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_HEALTH- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中声明
HIGH_SAMPLING_RATE_SENSORS权限。至少请求并被授予以下其中一项运行时权限:
- 在 API 级别 35 及更低级别上使用
BODY_SENSORS READ_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
- 在 API 级别 35 及更低级别上使用
注意:
BODY_SENSORS和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的health前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。
Lokalizacja
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypelocation- 在清单中声明的权限
FOREGROUND_SERVICE_LOCATION- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_LOCATION- 运行时前提条件
用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:
注意:如需检查用户是否已启用位置信息服务以及是否已授予对运行时权限的访问权限,请使用
PermissionChecker#checkSelfPermission()注意:位置信息运行时权限受“使用期间”限制。因此,除非您已获得
ACCESS_BACKGROUND_LOCATION运行时权限,否则无法在应用在后台运行时创建location前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制。- 说明
需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。
- 替代方案
如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API。
Multimedia
- Typ usługi na pierwszym planie do zadeklarowania w pliku manifestu w sekcji
android:foregroundServiceTypemediaPlayback- Uprawnienia do zadeklarowania w pliku manifestu
FOREGROUND_SERVICE_MEDIA_PLAYBACK- stała wartość przekazywana do
startForeground(), FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- Wymagania wstępne środowiska wykonawczego
- Brak
- Opis
- Ciągłe odtwarzanie dźwięku lub wideo w tle. Obsługa funkcji cyfrowego nagrywania wideo (DVR) na Androidzie TV.
- Alternatywy
- Jeśli wyświetlasz film w trybie obrazu w obrazie, użyj trybu obrazu w obrazie.
Wyświetlanie multimediów
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemediaProjection- 在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PROJECTION- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- 运行时前提条件
在启动前台服务之前调用
createScreenCaptureIntent()方法。这样做会向用户显示权限通知;用户必须先授予权限,您才能创建服务。创建前台服务后,您可以调用
MediaProjectionManager.getMediaProjection()。- 说明
使用
MediaProjectionAPI 将内容投影到非主要显示屏或外部设备。这些内容不必全都为媒体内容。- 替代方案
如需将媒体流式传输到其他设备,请使用 Google Cast SDK。
mikrofon
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemicrophone- 在清单中声明的权限
FOREGROUND_SERVICE_MICROPHONE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MICROPHONE- 运行时前提条件
请求并获得
RECORD_AUDIO运行时权限。注意:
RECORD_AUDIO运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建microphone前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
在后台继续捕获麦克风内容,例如录音器或通信应用。
Rozmowa telefoniczna
- Typ usługi na pierwszym planie do zadeklarowania w pliku manifestu w sekcji
android:foregroundServiceTypephoneCall- Uprawnienia do zadeklarowania w pliku manifestu
FOREGROUND_SERVICE_PHONE_CALL- stała wartość przekazywana do
startForeground(), FOREGROUND_SERVICE_TYPE_PHONE_CALL- Wymagania wstępne środowiska wykonawczego
Musi być spełniony co najmniej 1 z tych warunków:
- Aplikacja zadeklarowała uprawnienia
MANAGE_OWN_CALLSw pliku manifestu.
- Aplikacja zadeklarowała uprawnienia
- Aplikacja jest domyślną aplikacją do wybierania numerów w ramach roli
ROLE_DIALER.
- Aplikacja jest domyślną aplikacją do wybierania numerów w ramach roli
- Opis
Kontynuowanie trwającego połączenia za pomocą interfejsów API
ConnectionService.- Alternatywy
Jeśli chcesz wykonywać połączenia telefoniczne, wideo lub VoIP, użyj biblioteki
android.telecom.Rozważ użycie
CallScreeningServicedo filtrowania połączeń.
Zdalne przesyłanie wiadomości
- Typ usługi na pierwszym planie do zadeklarowania w pliku manifestu w sekcji
android:foregroundServiceTyperemoteMessaging- Uprawnienia do zadeklarowania w pliku manifestu
FOREGROUND_SERVICE_REMOTE_MESSAGING- stała wartość przekazywana do
startForeground(), FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- Wymagania wstępne środowiska wykonawczego
- Brak
- Opis
- Przenoszenie wiadomości tekstowych z jednego urządzenia na drugie. Dotyczy to pomocy w ciągłości wykonywania przez użytkownika zadań związanych z wiadomościami przy przełączaniu się na inne urządzenie.
Krótka usługa
- Typ usługi na pierwszym planie do zadeklarowania w pliku manifestu w sekcji
android:foregroundServiceTypeshortService- Uprawnienia do zadeklarowania w pliku manifestu
- Brak
- stała wartość przekazywana do
startForeground(), FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Wymagania wstępne środowiska wykonawczego
- Brak
- Opis
Szybkie ukończenie ważnych zadań, które nie mogą zostać przerwane ani przełożone.
Ten typ ma kilka unikalnych cech:
- może być uruchomiony tylko przez krótki czas (około 3 minut);
- Nieobsługiwane są przypięte usługi na pierwszym planie.
- Nie można uruchomić innych usług na pierwszym planie.
- Nie wymaga uprawnień związanych z typem, ale nadal wymaga uprawnień
FOREGROUND_SERVICE. - Usługa
shortServicemoże zmienić typ usługi na inny tylko wtedy, gdy aplikacja może obecnie uruchomić nową usługę na pierwszym planie. - Usługa na pierwszym planie może w dowolnym momencie zmienić typ na
shortService, co powoduje rozpoczęcie okresu oczekiwania.
Limit czasu dla krótkiej usługi rozpoczyna się od momentu wywołania funkcji
Service.startForeground(). Aplikacja powinna wywołać funkcjęService.stopSelf()lubService.stopForeground()przed przekroczeniem limitu czasu. W przeciwnym razie wywoływana jest nowa funkcjaService.onTimeout(), która daje aplikacjom krótką możliwość wywołania funkcjistopSelf()lubstopForeground()w celu zatrzymania usługi.Krótko po wywołaniu funkcji
Service.onTimeout()aplikacja przechodzi w stan buforowania i nie jest już uważana za aplikację na pierwszym planie, chyba że użytkownik aktywnie z nią współpracuje. Krótko po buforowaniu aplikacji, jeśli usługa nie została zatrzymana, aplikacja otrzymuje ANR. Komunikat ANR zawiera wzmiankę oFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Z tych powodów sprawdzoną metodą jest implementowanie funkcjiService.onTimeout()callback.Funkcja
Service.onTimeout()nie jest dostępna w Androidzie 13 i starszych. Jeśli ta sama usługa działa na takich urządzeniach, nie ma limitu czasu ani nie powoduje ANR. Upewnij się, że usługa zatrzymuje się, gdy tylko zakończy przetwarzanie zadania, nawet jeśli nie otrzymała jeszcze wywołania zwrotnegoService.onTimeout().Pamiętaj, że jeśli nie będziesz przestrzegać limitu czasu
shortService, aplikacja będzie generować błąd ANR, nawet jeśli ma inne prawidłowe usługi na pierwszym planie lub inne procesy cyklu życia aplikacji.Jeśli aplikacja jest widoczna dla użytkownika lub spełnia jedno z wyjątków, które umożliwiają uruchamianie usług na pierwszym planie w tle, ponowne wywołanie funkcji
Service.StartForeground()z parametremFOREGROUND_SERVICE_TYPE_SHORT_SERVICEwydłuża czas oczekiwania o kolejne 3 minuty. Jeśli aplikacja jest niewidoczna dla użytkownika i nie spełnia żadnego z wyjątków, każda próba uruchomienia innej usługi na pierwszym planie, niezależnie od jej typu, powoduje błądForegroundServiceStartNotAllowedException.Jeśli użytkownik wyłączy optymalizację baterii w aplikacji, nadal będzie ona podlegać limitowi czasu krótkiej usługi FGS.
Jeśli uruchomisz usługę na pierwszym planie, która obejmuje typ
shortServicei inny typ usługi na pierwszym planie, system zignoruje deklarację typushortService. Usługa musi jednak spełniać wymagania wstępne innych zadeklarowanych typów. Więcej informacji znajdziesz w dokumentacji dotyczącej usług na pierwszym planie.
Specjalne zastosowanie
- 要在清单中声明的前台服务类型
android:foregroundServiceTypespecialUse- 在清单中声明的权限
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>
System wykluczony
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypesystemExempted- 在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- 运行时前提条件
- 无
- 说明
为系统应用和特定系统集成预留,使其能继续使用前台服务。
如需使用此类型,应用必须至少满足以下条件之一:
- 设备处于演示模式状态
- 应用是设备所有者
- 应用是性能分析器所有者
- 属于具有
ROLE_EMERGENCY角色的安全应用 - 属于设备管理应用
- 具有
SCHEDULE_EXACT_ALARM或USE_EXACT_ALARM权限且使用前台服务在后台继续闹钟(包括仅振动闹钟)的应用。 VPN 应用(使用设置 > 网络和互联网 > VPN 进行配置)
否则,声明此类型会导致系统抛出
ForegroundServiceTypeNotAllowedException。
Egzekwowanie zasad Google Play w przypadku korzystania z typów usług na pierwszym planie
Jeśli Twoja aplikacja jest kierowana na Androida 14 lub nowszego, musisz zadeklarować typy usług na pierwszym planie w Konsoli Play na stronie „Zawartość aplikacji” (Zasady > Zawartość aplikacji). Więcej informacji o deklarowaniu typów usług na pierwszym planie w Konsoli Play znajdziesz w artykule Omówienie wymagań dotyczących usług działających na pierwszym planie i intencji pełnoekranowych.