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 quando os apps podem ser iniciados. atividades quando o app é executado em segundo plano. Essas restrições ajudam a minimizar interrupções para o usuário e dar ao usuário mais controle sobre o que é mostrado na tela.

Este guia apresenta as notificações como uma alternativa para iniciar atividades a partir de em segundo plano. Ela também lista os casos específicos em que a restrição não se aplicam.

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 alarme ativo relógio.

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 vê uma notificação de alerta que permite responder. O usuário mantém o contexto atual e tem controle sobre a do conteúdo que eles veem na tela.
  • As notificações com limite de tempo respeitam Regras do Não perturbe. Para exemplo, os usuários podem permitir chamadas somente de contatos específicos ou de chamadas autores de chamadas quando o modo Não perturbe estiver 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 têm notificações enviadas 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 executados no Android 10 ou versões mais recentes podem iniciar atividades quando: pelo menos uma 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 backstack do tarefa em primeiro plano.
  • O app tem uma atividade na backstack de uma tarefa existente na Tela "Recentes".

  • O app tem uma atividade que começou muito recentemente.

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

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

  • O app tem um serviço vinculado por outro app visível. O app vinculados ao serviço precisam permanecer visíveis para que o app em segundo plano iniciar atividades com sucesso.

  • O app recebe uma notificação PendingIntent no sistema. Em 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 dispositivo diferente app.

  • O aplicativo recebe uma transmissão do sistema em que se espera que ele inicie uma de ML pela UI. 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 aplicativo está associado a um dispositivo de hardware complementar por meio do CompanionDeviceManager API. Essa API permite que o aplicativo inicie atividades em resposta a ações que o usuário faz em um dispositivo pareado.

  • O app é um controlador de política de dispositivo em execução no modo proprietário do dispositivo. Exemplos de casos de uso incluem dispositivos corporativos totalmente gerenciados além de dispositivos dedicados, como sinalização e quiosques.

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

A ativação é necessária ao iniciar atividades de PendingIntents

Para evitar permitir o início de atividades acidentais com base no . A partir do Android 14, há APIs explícitas que permitem que você para ativar ou desativar a concessão de permissões de app para inícios de atividade.

Os apps destinados ao Android 15 ou versões mais recentes vão deixar de ser usados implicitamente concedendo privilégios de inicialização de atividades em segundo plano (BAL, na sigla em inglês) para o PendingIntents que eles criar. A aceitação explícita é necessária, para isso, estas são as opções dependendo se o app está enviando ou criando PendingIntents.

Tabela de intents pendentes
Figura 1: fluxo de decisão para inicializações de atividades em segundo plano.

Pelo Remetente da PendingIntent

Os apps destinados ao Android 14 ou mais recente que vão iniciar uma PendingIntent precisam ser

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

Essa ativação acontece se o desenvolvedor do app sabe que o app é iniciar uma atividade.

Para ativar o recurso, o app precisa transmitir um pacote ActivityOptions com setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) 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 agora precisam ativar explicitamente a inicialização de atividades em segundo plano se quiser que os PendingIntents para ser iniciado sob as condições listadas.

Na maioria dos casos, é preciso ativar o app que inicia a PendingIntent. No entanto, se o app de criação precisar conceder esses privilégios:

  • A PendingIntent pode ser iniciada a qualquer momento em que o app de criação estiver visível.
  • A PendingIntent poderá ser iniciada a qualquer momento se o app de criação tiver recursos para conceder privilégios de acesso.
.

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: