O Android 10 (nível 29 da API) e versões mais recentes impõem restrições sobre quando os apps podem iniciar atividades quando o app é executado em segundo plano. Essas restrições ajudam a minimizar as interrupções para os usuários, além de mantê-los com maior controle sobre o que é exibido na tela.
Este guia apresenta as notificações como uma alternativa para iniciar atividades em segundo plano. Ele também lista os casos específicos em que a restrição não se aplica.
Exibir notificações
Em quase todos os casos, os apps em segundo plano precisam mostrar notificações com limite de tempo para fornecer informações urgentes ao usuário em vez de iniciar uma atividade diretamente. Essas notificações incluem o processamento de uma chamada telefônica recebida ou um despertador ativo.
Esse sistema de alerta e lembrete baseado em notificações oferece várias vantagens para os usuários:
- Ao usar o dispositivo, o usuário recebe uma notificação de informações básicas que permite responder. O usuário mantém o contexto atual e tem controle sobre o conteúdo exibido na tela.
- As notificações com limite de tempo respeitam as regras de Não perturbe do usuário. Por exemplo, quando o Não perturbe está ativado, os usuários podem permitir chamadas apenas de contatos específicos ou de quem já tenha ligado anteriormente.
- Quando a tela do dispositivo está desligada, a intent de tela cheia é iniciada imediatamente.
- Na tela Configurações do dispositivo, o usuário pode ver quais apps enviaram notificações recentemente, inclusive de canais de notificação específicos. Nessa tela, ele pode controlar as preferências de notificação.
Quando os apps podem iniciar atividades
Os apps que operam no Android 10 ou versões mais recentes podem iniciar atividades quando uma ou mais das condições a seguir for atendida:
- O app tem uma janela visível, como uma atividade em primeiro plano.
- O app tem uma atividade na backstack da tarefa em primeiro plano.
O app tem uma atividade na backstack de uma tarefa na tela Recentes.
O app tem uma atividade que começou muito recentemente.
O app chamou
finish()
em uma atividade muito recentemente. Isso se aplica somente quando o app tem uma atividade em primeiro plano ou uma atividade na backstack da tarefa em primeiro plano no momento em quefinish()
é chamado.O app tem um dos serviços a seguir que é vinculado pelo sistema. Esses serviços podem precisar iniciar uma interface.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(não se aplica ao Android 14 (nível 34 da API) e versões mais recentes)VoiceInteractionService
VrListenerService
.
O app tem um serviço vinculado por um app visível diferente. O app vinculado ao serviço precisa permanecer visível para que o app em segundo plano inicie as atividades.
O app recebe uma notificação
PendingIntent
do sistema. No caso de intents pendentes para serviços e broadcast receivers, o app pode iniciar atividades por alguns segundos após o envio da intent pendente.O app recebe uma
PendingIntent
enviada de um app visível diferente.O app recebe uma transmissão do sistema em que espera-se que ele inicie uma interface. Os exemplos incluem
ACTION_NEW_OUTGOING_CALL
eSECRET_CODE_ACTION
. O aplicativo pode iniciar atividades por alguns segundos após o envio da transmissão.O app está associado a um dispositivo de hardware complementar pela API
CompanionDeviceManager
. Essa API permite que o app inicie atividades em resposta a ações que o usuário realiza em um dispositivo pareado.O app é um controlador de política de dispositivo em execução no modo de proprietário do dispositivo. Exemplos de casos de uso incluem dispositivos corporativos totalmente gerenciados e dispositivos dedicados, como sinalização digital e quiosques.
O app recebeu a permissão
SYSTEM_ALERT_WINDOW
do usuário.
Ativação necessária ao iniciar atividades de PendingIntents
Para evitar inicializações acidentais da atividade com base nas condições listadas, a partir do Android 14, há APIs explícitas que permitem ativar ou desativar a concessão de permissões de um app para inicializações de atividades.
Os apps destinados ao Android 15 ou mais recente não vão mais conceder implicitamente
privilégios de inicialização de atividade em segundo plano (BAL) para PendingIntents
criados. É necessário o consentimento explícito. Para isso, estas são as opções, dependendo se o app está enviando ou criando PendingIntents
.
Pelo remetente do PendingIntent
Os apps destinados ao Android 14 ou mais recente que querem iniciar uma PendingIntent
precisam
- cumprir as condições listadas, e
- permitir o início de atividades em segundo plano com base nessas exceções.
Essa opção só vai acontecer se o desenvolvedor souber que o app vai iniciar uma atividade.
Para ativar o recurso, o app precisa transmitir um pacote ActivityOptions
com
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
para o PendingIntent.send()
ou métodos semelhantes.
Pelo criador do PendingIntent
Os apps destinados ao Android 15 ou mais recente que criam uma PendingIntent
agora precisam
explicitamente ativar a inicialização de atividades em segundo plano se quiserem que
PendingIntents
sejam inicializáveis nas condições listadas.
Na maioria dos casos, o app que inicia a PendingIntent
precisa ativar a opção.
No entanto, se o app de criação precisar conceder esses privilégios:
- O
PendingIntent
pode ser iniciado a qualquer momento que o app de criação estiver visível. - O
PendingIntent
pode ser iniciado a qualquer momento se o app de criação tiver privilégios especiais.
Para ativar o recurso, o app precisa transmitir um pacote ActivityOptions
com
setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
para o
PendingIntent.getActivity()
ou métodos semelhantes.
Leia a documentação de referência relevante para mais detalhes:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode