Tipos de serviços em primeiro plano

No Android 14 (nível 34 da API) e versões mais recentes, é necessário declarar um tipo de serviço adequado para cada serviço em primeiro plano. Isso significa que você precisa declarar o tipo de serviço no manifesto do app e solicitar a permissão de serviço em primeiro plano adequada para esse tipo, além de solicitar a permissão FOREGROUND_SERVICE. Além disso, dependendo do tipo de serviço em primeiro plano, talvez seja necessário solicitar permissões de execução antes de iniciar o serviço.

Câmera

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

请求并获得 CAMERA 运行时权限

注意CAMERA 运行时权限受使用时限制。因此,当您的应用位于后台时,您无法创建 camera 前台服务,但存在一些例外情况。如需了解详情,请参阅有关启动需要运行时权限的前台服务的限制

说明

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

Dispositivo conectado

Tipo de serviço em primeiro plano a ser declarado no manifesto
android:foregroundServiceType
connectedDevice
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_CONNECTED_DEVICE
Constante a ser transmitida para startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
Pré-requisitos de tempo de execução

Pelo menos uma das condições a seguir precisa ser verdadeira:

Descrição

Interações com dispositivos externos que exigem uma conexão Bluetooth, NFC, IR, USB ou de rede.

Alternativas

Se o app precisar fazer uma transferência contínua de dados para um dispositivo externo, use o gerenciador de dispositivos complementar. Use a API de presença de dispositivo complementar para ajudar o app a continuar em execução enquanto o dispositivo complementar estiver ao alcance.

Se o app precisar procurar dispositivos Bluetooth, use a API Bluetooth Scan.

Sincronização de dados

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

数据传输操作,例如:

  • 数据上传或下载
  • 备份和恢复操作
  • 导入或导出操作
  • 获取数据
  • 本地文件处理
  • 通过网络在设备和云端之间传输数据
替代方案

如需了解详情,请参阅数据同步前台服务的替代方案

Saúde

Tipo de serviço em primeiro plano a ser declarado no manifesto
android:foregroundServiceType
health
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_HEALTH
Constante a ser transmitida para startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Pré-requisitos de tempo de execução

Pelo menos uma das condições a seguir precisa ser verdadeira:

Observação:a permissão de execução BODY_SENSORS está sujeita a restrições durante o uso. Por esse motivo, não é possível criar um serviço em primeiro plano health que use sensores corporais enquanto o app estiver em segundo plano, com algumas exceções. Para mais informações, consulte Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso.

Descrição

Todos os casos de uso de longa duração que oferecem suporte a apps na categoria fitness, como apps de monitoramento de atividade física.

Local

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

用户必须已启用位置信息服务,并且必须至少向应用授予以下运行时权限之一:

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

注意:位置信息运行时权限受使用时限制的约束。因此,当应用在后台运行时,您无法创建 location 前台服务,除非您已被授予 ACCESS_BACKGROUND_LOCATION 运行时权限。如需了解详情,请参阅对启动需要在使用时授予权限的前台服务的限制

说明

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

替代方案

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

Mídia

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

Projeção de mídia

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

在启动前台服务之前,调用 createScreenCaptureIntent() 方法。执行此操作会向用户显示权限通知;用户必须授予权限,您才能创建服务。

创建前台服务后,您可以调用 MediaProjectionManager.getMediaProjection()

说明

使用 MediaProjection API 将内容投影到非主要显示屏或外部设备。这些内容不一定是完全媒体内容。

替代方案

如需将媒体内容流式传输到其他设备,请使用 Google Cast SDK

Microfone

Tipo de serviço em primeiro plano a ser declarado no manifesto
android:foregroundServiceType
microphone
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_MICROPHONE
Constante a ser transmitida para startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
Pré-requisitos de tempo de execução

Solicite e receba a permissão de execução RECORD_AUDIO.

Observação:a permissão de execução RECORD_AUDIO está sujeita a restrições durante o uso. Por esse motivo, não é possível criar um serviço em primeiro plano microphone enquanto o app está em segundo plano, com algumas exceções. Para mais informações, consulte Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso.

Descrição

Continue a captura do microfone em segundo plano, como gravadores de voz ou apps de comunicação.

Ligação telefônica

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

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

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

使用 ConnectionService API 继续当前通话。

替代方案

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

不妨考虑使用 CallScreeningService 过滤来电。

Mensagens remotas

要在其清单中声明的前台服务类型
android:foregroundServiceType
remoteMessaging
在清单中声明的权限
FOREGROUND_SERVICE_REMOTE_MESSAGING
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
运行时前提条件
说明
将短信从一台设备转移到另一台设备。在用户切换设备时,帮助确保用户消息任务的连续性。

Serviço curto

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

快速完成不可中断或推迟的关键工作。

这种类型有一些独特的特征:

  • 只能持续运行一小段时间(大约 3 分钟)。
  • 不支持粘性前台服务。
  • 无法启动其他前台服务。
  • 不需要类型专用权限,不过它仍需要 FOREGROUND_SERVICE 权限。
  • 只有当应用当前有资格启动新的前台服务时,shortService 才能更改为另一种服务类型。
  • 前台服务可以随时将其类型更改为 shortService,届时超时期限将开始。

shortService 的超时时间从调用 Service.startForeground() 开始算起。应用应在发生超时之前调用 Service.stopSelf()Service.stopForeground()。否则,系统会调用新的 Service.onTimeout(),让应用有机会调用 stopSelf()stopForeground() 来停止其服务。

调用 Service.onTimeout() 后的短时间内,应用会进入缓存状态,并且不再被视为处于前台,除非用户正在主动与应用互动。应用缓存一小段时间后,服务还未停止,该应用会收到 ANR 消息。ANR 消息提及 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE。出于这些原因,实现 Service.onTimeout() 回调被视为一种最佳实践。

Android 13 及更低版本中不存在 Service.onTimeout() 回调。如果同一服务在此类设备上运行,则不会出现超时,也不会发生 ANR。确保您的服务在完成处理任务后立即停止,即使它尚未收到 Service.onTimeout() 回调也是如此。

请务必注意,如果未遵循 shortService 的超时设置,即使应用还有其他有效的前台服务或其他应用生命周期进程,应用也会遇到 ANR。

如果应用对用户可见,或满足允许从后台启动前台服务的某一豁免条件,则使用 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE 参数再次调用 Service.StartForeground() 会将超时时间再延长 3 分钟。如果应用对用户不可见且不满足其中一个豁免条件,则尝试启动其他前台服务(无论其类型如何)都会导致 ForegroundServiceStartNotAllowedException

即使用户为您的应用停用电池优化功能,仍然会受到 shortService FGS 的影响。

如果您启动包含 shortService 类型和另一个前台服务类型的前台服务,系统会忽略 shortService 类型声明。不过,该服务仍必须遵守其他声明类型的前提条件。如需了解详情,请参阅前台服务文档

Uso especial

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

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

除了声明 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在 <service> 元素内指定 <property> 元素。当您在 Google Play 管理中心内提交应用时,我们会审核这些值和相应的用例。您提供的用例是自由形式的,您应确保提供足够的信息,让审核人员了解您为何需要使用 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>

Sistema isento

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

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

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

Aplicação da política do Google Play para uso de tipos de serviço em primeiro plano

Caso o app seja destinado ao Android 14 ou versões mais recentes, declare os tipos de serviço em primeiro plano na página de conteúdo do app no Play Console (Política > Conteúdo do app). Para mais informações sobre como declarar os tipos de serviço em primeiro plano no Play Console, consulte Noções básicas sobre o serviço em primeiro plano e os requisitos de intent para tela cheia.