Os apps destinados ao Android 12 (nível 31 da API) ou versões mais recentes não podem iniciar serviços em primeiro plano
enquanto o app está em execução em segundo plano, exceto em alguns casos especiais. Se um app tentar iniciar um
serviço em primeiro plano enquanto estiver em segundo plano e o serviço em primeiro plano não se enquadrar em um dos casos excepcionais, o sistema vai gerar uma
ForegroundServiceStartNotAllowedException.
Além disso, se um app quiser iniciar um serviço em primeiro plano que precise de permissões durante o uso (por exemplo, sensor corporal, câmera, microfone ou permissões de localização), ele não poderá criar o serviço enquanto estiver em segundo plano, mesmo que se enquadre em uma das isenções das restrições de inicialização em segundo plano. O motivo disso é explicado na seção Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso .
Isenções das restrições de inicialização em segundo plano
O app poderá iniciar serviços em primeiro plano enquanto estiver em segundo plano nas seguintes situações:
- O app estava em um estado visível para o usuário, como uma atividade.
- O app pode iniciar uma atividade do segundo plano, exceto quando o app tem uma atividade na backstack para uma tarefa existente.
O app recebe uma mensagem de alta prioridade usando Firebase Cloud Messaging.
O usuário realiza uma ação em um elemento da interface relacionado ao app. Por exemplo, o usuário pode interagir com um balão, notificação, widget ou atividade.
O app invoca um alarme exato para concluir uma ação solicitada pelo usuário.
O app recebe um evento relacionado à fronteira geográfica virtual ou à transição de reconhecimento de atividade.
Após o dispositivo ser reiniciado e receber a
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETED, ouACTION_MY_PACKAGE_REPLACEDação da intent em um broadcast receiver.O app recebe a ação da intent
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGED, ouACTION_LOCALE_CHANGEDem um broadcast receiver.O app recebe o
ACTION_TRANSACTION_DETECTEDevento deNfcService.Apps com determinados papéis ou permissões do sistema, como proprietários de dispositivo e proprietários deperfil.
O app usa o Gerenciador de dispositivo complementar e declara a
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDpermissão ou aREQUEST_COMPANION_RUN_IN_BACKGROUNDpermissão. Sempre que possível, useREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.O usuário desativa as otimizações de bateria para o app.
O app tem a
SYSTEM_ALERT_WINDOWpermissão. Observação: se o app for destinado ao Android 15 ou versões mais recentes, ele precisará ter a permissãoSYSTEM_ALERT_WINDOWe o app precisará ter uma janela de sobreposição visível.
Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso
No Android 14 (nível 34 da API) ou versões mais recentes, há situações especiais que você precisa conhecer se estiver iniciando um serviço em primeiro plano que precisa de permissões durante o uso.
Se o app for destinado ao Android 14 ou versões mais recentes, o sistema operacional vai verificar quando você criar um serviço em primeiro plano para garantir que o app tenha todas as permissões adequadas para esse tipo de serviço. Por exemplo, ao criar um
serviço em primeiro plano do tipo
microfone, o sistema
operacional verifica se o app tem a
RECORD_AUDIO
permissão. Se você não tiver essa permissão, o sistema vai gerar uma
SecurityException.
Para permissões durante o uso, isso causa um problema em potencial. Se o app tiver uma
permissão durante o uso, ele só terá essa permissão enquanto estiver em
primeiro plano. Isso significa que, se o app estiver em segundo plano e tentar criar um serviço em primeiro plano do tipo câmera, localização ou microfone, o sistema vai perceber que o app não tem as permissões necessárias no momento e vai gerar uma SecurityException.
Da mesma forma, se o app estiver em segundo plano e criar um serviço de saúde que precise da permissão BODY_SENSORS, o app não terá essa permissão no momento, e o sistema vai gerar uma exceção.
Isso não se aplica se for um serviço de saúde que precise de permissões diferentes,
como ACTIVITY_RECOGNITION. Chamar
PermissionChecker.checkSelfPermission()
não impede esse problema. Se o app tiver uma permissão durante o uso e chamar checkSelfPermission() para verificar se ele tem essa permissão, o método vai retornar PERMISSION_GRANTED mesmo que o app esteja em segundo plano. Quando o método retorna PERMISSION_GRANTED, ele está dizendo "seu app tem essa permissão enquanto o app está em uso".
Por esse motivo, se o serviço em primeiro plano precisar de uma permissão durante o uso, você
precisará chamar Context.startForegroundService() ou Context.bindService() enquanto
o app tiver uma atividade visível, a menos que o serviço se enquadre em uma das
isenções definidas.
Isenções de restrições em permissões durante o uso
Em algumas situações, mesmo que um serviço em primeiro plano seja iniciado enquanto o app está em execução em segundo plano, ele ainda poderá acessar informações de localização, câmera e microfone enquanto o app estiver em execução em primeiro plano ("durante o uso").
Nessas mesmas situações, se o serviço declarar um tipo de serviço em primeiro plano
de location e for iniciado por um app que
tenha a permissão ACCESS_BACKGROUND_LOCATION, esse serviço poderá acessar informações de localização o tempo todo, mesmo quando
o app estiver em execução em segundo plano.
A lista a seguir contém essas situações:
- Um componente do sistema inicia o serviço.
- O serviço é iniciado por uma interação com widgets de apps.
- O serviço é iniciado por uma interação com uma notificação.
- O serviço é iniciado como um
PendingIntentenviado por um app diferente e visível. - O serviço é iniciado por um app que é um controlador de política de dispositivo em execução no modo de proprietário do dispositivo.
- O serviço é iniciado por um app que fornece o
VoiceInteractionService. - O serviço é iniciado por um app com a permissão privilegiada
START_ACTIVITIES_FROM_BACKGROUND.
Determinar quais serviços são afetados no seu app
Ao testar seu app, inicie os serviços em primeiro plano. Se um serviço iniciado tiver acesso restrito à localização, ao microfone e à câmera, a seguinte mensagem será exibida no Logcat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME