Tipos de serviços em primeiro plano

A partir do Android 14 (nível 34 da API), é 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 também solicitar a permissão de serviço em primeiro plano adequada para esse tipo (além de solicitar a FOREGROUND_SERVICE permissão). 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 运行时权限

说明

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

Dispositivo conectado

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

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

说明

与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。

替代方案

如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。

如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API

Sincronização de dados

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
dataSync
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_DATA_SYNC
Constante para transmitir a startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
Pré-requisitos de ambiente de execução
Nenhum
Descrição

Operações de transferência de dados, como as seguintes:

  • Upload ou download de dados
  • Operações de backup e restauração
  • Operações de importação ou exportação
  • Busca de dados
  • Processamento local de arquivos
  • Transferência de dados entre um dispositivo e a nuvem por uma rede
Alternativas

Consulte Alternativas aos serviços de sincronização de dados em primeiro plano para informações detalhadas.

Saúde

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

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

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

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
location
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_LOCATION
Constante para transmitir para startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
Pré-requisitos do ambiente de execução

O usuário precisa ter ativado os serviços de localização, e o app precisa ter pelo menos uma das seguintes permissões de execução:

Descrição

Casos de uso de longa duração que exigem acesso à localização, como navegação e compartilhamento de local.

Alternativas

Se o app precisar ser acionado quando o usuário chegar a locais específicos, use a API Geofence.

Mídia

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
mediaPlayback
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Constante para transmitir a startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Pré-requisitos de ambiente de execução
Nenhum
Descrição

Continue a reprodução de áudio ou vídeo em segundo plano. Suporte à funcionalidade de gravação de vídeo digital (DVR) no Android TV.

Alternativas

Se você estiver mostrando um vídeo picture-in-picture, use o modo picture-in-picture.

Mídia em processamento

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

用于对媒体资源执行耗时的操作(例如将媒体转换为其他格式)的服务。系统允许此服务运行的时间有限;在正常情况下,此时限为每天 24 小时中的 6 小时。(此限制由应用的所有 mediaProcessing 前台服务共享。)

在以下情况下,您的应用应手动停止媒体处理服务:

如果超时期限已到,系统会调用服务的 Service.onTimeout(int, int) 方法。此时,该服务有几秒钟的时间来调用 Service.stopSelf()。如果服务未调用 Service.stopSelf(),则会发生 ANR,并显示以下错误消息:“<fgs_type> 的前台服务未在超时时间内停止:<component_name>”。

注意Service.onTimeout(int, int) 不适用于 Android 14 或更低版本。在搭载这些版本的设备上,如果媒体处理服务达到超时期限,系统会立即缓存应用。因此,您的应用不应等待收到超时通知。相反,它应在适当情况下尽快终止前台服务或将其更改为后台服务。

Projeção de mídia

Foreground service type to declare in manifest under
android:foregroundServiceType
mediaProjection
Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
Runtime prerequisites

Call the createScreenCaptureIntent() method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.

After you have created the foreground service, you can call MediaProjectionManager.getMediaProjection().

Description

Project content to non-primary display or external device using the MediaProjection APIs. This content doesn't have to be exclusively media content.

Alternatives

To stream media to another device, use the Google Cast SDK.

Microfone

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

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

Descrição

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

Ligação telefônica

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
phoneCall
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_PHONE_CALL
Constante para transmitir a startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Pré-requisitos de ambiente de execução

Pelo menos uma destas condições precisa ser verdadeira:

  • O app é o discador padrão pela função ROLE_DIALER.
Descrição

Continue uma chamada usando as APIs ConnectionService.

Alternativas

Se você precisar fazer ligações, videochamadas ou chamadas VoIP, use a biblioteca android.telecom.

Considere usar o CallScreeningService para filtrar ligações.

Mensagens remotas

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
remoteMessaging
Permissão a ser declarada no manifesto
FOREGROUND_SERVICE_REMOTE_MESSAGING
Constante para transmitir para startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
Pré-requisitos do ambiente de execução
Nenhum
Descrição
Transferir mensagens de texto de um dispositivo para outro. Ajuda na continuidade das tarefas de mensagens de um usuário ao trocar de dispositivo.

Serviço curto

Tipo de serviço em primeiro plano a ser declarado no manifesto em
android:foregroundServiceType
shortService
Permissão a ser declarada no manifesto
Nenhum
Constante para transmitir para startForeground()
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
Pré-requisitos do ambiente de execução
Nenhum
Descrição

Conclua rapidamente trabalhos essenciais que não podem ser interrompidos ou adiados.

Esse tipo tem algumas características únicas:

  • Pode ser executado por um curto período de tempo (cerca de três minutos).
  • Não oferece suporte a serviços fixos em primeiro plano.
  • Não inicia outros serviços em primeiro plano.
  • Não requer uma permissão específica do tipo, embora ainda exija a permissão FOREGROUND_SERVICE.
  • Um shortService só pode mudar para outro tipo de serviço se o app estiver qualificado para iniciar um novo serviço em primeiro plano.
  • Um serviço em primeiro plano pode mudar o tipo para shortService a qualquer momento. Nesse ponto, o período de tempo limite começa.

O tempo limite de shortService começa no momento em que Service.startForeground() é chamado. O app precisa chamar Service.stopSelf() ou Service.stopForeground() antes que o tempo limite seja atingido. Caso contrário, o novo Service.onTimeout() será chamado, dando aos apps a oportunidade de chamar stopSelf() ou stopForeground() para interromper o serviço.

Pouco depois que Service.onTimeout() é chamado, o app entra em um estado em cache e não é mais considerado em primeiro plano, a menos que o usuário esteja interagindo ativamente com ele. Se o app entra nesse estado e o serviço não é interrompido, o app recebe um erro ANR. A mensagem ANR menciona FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Por esses motivos, uma prática recomendada é implementar o callback Service.onTimeout().

O callback Service.onTimeout() não existe no Android 13 e nas versões anteriores. Se o mesmo serviço for executado nesses dispositivos, ele não receberá um tempo limite nem um erro ANR. Confira se o serviço é interrompido assim que a tarefa de processamento é terminada, mesmo que ele ainda não tenha recebido o callback Service.onTimeout().

É importante observar que, se o tempo limite do shortService não for respeitado, o app receberá um erro ANR mesmo que tenha outros serviços em primeiro plano válidos ou outros processos de ciclo de vida em execução.

Se um app estiver visível para o usuário ou atender a uma das isenções que permitem que serviços em primeiro plano sejam iniciados em segundo plano, chame Service.StartForeground() novamente com o parâmetro FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, que estende o tempo limite em mais três minutos. Se o app não estiver visível para o usuário e não atender a uma das isenções, qualquer tentativa de iniciar outro serviço em primeiro plano, independente do tipo, vai causar uma ForegroundServiceStartNotAllowedException.

Se um usuário desativar a otimização da bateria para seu app, ele ainda será afetado pelo tempo limite do shortService FGS.

Se você iniciar um serviço em primeiro plano que inclua o tipo shortService e outro tipo de serviço em primeiro plano, o sistema vai ignorar a declaração do tipo shortService. No entanto, o serviço ainda precisa aderir aos pré-requisitos dos outros tipos declarados. Para mais informações, consulte a documentação de serviços em primeiro plano.

Uso especial

要在清单中声明的前台服务类型
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>

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

Se o app for direcionado ao Android 14 ou versões mais recentes, será necessário declarar os tipos de serviço em primeiro plano na página "Conteúdo do app" do Play Console (Política > Conteúdo do app). Para mais informações sobre como declarar seus tipos de serviço em primeiro plano no Play Console, consulte Saiba mais sobre o serviço em primeiro plano e os requisitos de intent para tela cheia.