Restrições ao iniciar atividades a partir do segundo plano

O Android 10 (nível 29 da API) e versões mais recentes impõem restrições sobre o momento em que os apps podem iniciar atividades quando são executados em segundo plano. Essas restrições ajudam a minimizar interrupções para o usuário e mantê-lo mais controle sobre o que é mostrado 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 exibir notificações urgentes para fornecer informações urgentes ao usuário, em vez de iniciar uma atividade diretamente. Essas notificações incluem o processamento de uma ligação 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 alerta que permite responder. O usuário mantém o contexto atual e tem controle sobre o conteúdo exibido na tela.
  • As notificações urgentes respeitam as regras Não perturbe do usuário. Por exemplo, os usuários podem permitir chamadas apenas de contatos específicos ou de autores de chamadas recorrentes quando o modo Não perturbe está ativado.
  • 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

Apps executados no Android 10 ou versões mais recentes podem iniciar atividades quando uma ou mais das seguintes condições são atendidas:

  • O aplicativo 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 iniciada muito recentemente.

  • O app chamou finish() em uma atividade muito recentemente. Isso se aplica apenas quando o app tinha uma atividade em primeiro plano ou uma atividade na backstack da tarefa em primeiro plano no momento em que finish() foi chamado.

  • O app tem um dos serviços a seguir vinculado pelo sistema. Esses serviços podem precisar iniciar uma interface.

  • O app tem um serviço vinculado por um app diferente e visível. Ele precisa permanecer visível para que o app em segundo plano possa iniciar 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 um PendingIntent enviado de um app visível diferente.

  • O app recebe uma transmissão do sistema em que se espera que ele inicie uma interface. Os exemplos incluem ACTION_NEW_OUTGOING_CALL e SECRET_CODE_ACTION. O aplicativo pode iniciar atividades por alguns segundos após o envio da transmissão.

  • O app é 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. Os exemplos de casos de uso incluem dispositivos corporativos totalmente gerenciados e dispositivos dedicados, como quiosques e sinalização digital.

  • O app recebe a permissão SYSTEM_ALERT_WINDOW do usuário.

É necessário ativar o recurso ao iniciar atividades com PendingIntents

Para evitar o início de atividades acidentais com base nas contições listadas, no Android 14 e versões mais recentes, há APIs explícitas que permitem ativar ou desativar a concessão de permissões de apps para inícios de atividade.

Consulte:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

Pelo remetente da PendingIntent

Os apps destinados ao Android 14 ou mais recente que quiserem iniciar uma PendingIntent precisam

  • cumprir as contições listadas e
  • Ativar a inicialização de atividades em segundo plano com base nessas exceções

Essa ativação vai acontecer se o desenvolvedor do app souber que o app iniciará uma atividade.

Para ativar, o app precisa transmitir um pacote ActivityOptions com setPendingIntentBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ao PendingIntent.send(...) ou métodos semelhantes.

Pelo criador da PendingIntent

Os apps destinados ao Android 15 ou versões mais recentes que criam uma PendingIntent precisam

  • cumprir as contições listadas e
  • Ativar a inicialização de atividades em segundo plano com base nessas exceções

Na maioria dos casos, o app que inicia a PendingIntent precisa ser ativado pelo app.

Quando o app que cria a PendingIntent é ativado, acontece o seguinte:

  • O PendingIntent pode ser iniciado a qualquer momento em que o app de criação está visível.
  • O PendingIntent pode ser iniciado a qualquer momento se o app de criação tiver privilégios especiais

Portanto, é uma prática recomendada não transmitir essa PendingIntent para um app não confiável e cancelar o PendingIntent quando ele não precisar mais ser usado.

Para ativar, o app precisa transmitir um pacote ActivityOptions com setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ao PendingIntent.getActivity(...) ou métodos semelhantes.