Política de lançamento de atividades

O comportamento de inicialização da atividade é definido pelos modos de inicialização nos arquivos AndroidManifest.xml de apps, flags de intent e ActivityOptions fornecidos pelo autor da chamada. Use ActivityOption#setLaunchDisplayId(int) para segmentar uma tela específica para a inicialização da atividade.

  • Por padrão, a atividade é iniciada na mesma tela que a autora da chamada. Por exemplo, uma nova instância de uma atividade iniciada pelo iniciador precisa ser colocada na mesma tela sem sinalizações ou opções adicionais. Use o contexto correto (atividade versus aplicativo) para iniciar.
  • Se a inicialização for realizada de uma fonte não associada a uma tela específica (como de um shell ou contexto do app), a atividade será colocada na tela de cima em que o usuário interagiu pela última vez com o dispositivo ou de onde a última atividade foi iniciada.
  • A intent para iniciar uma atividade pode ser resolvida para uma instância de atividade existente no sistema. Nesse caso, se nenhuma flag adicional for fornecida, uma atividade será exibida na mesma tela em que foi usada pela última vez. Se a tela de destino for especificada com ActivityOptions#setTargetDisplayId(), a atividade será movida para essa tela (se permitida pela segurança e outras restrições).

Restrições de segurança

Para evitar que um app malicioso se aproprie indevidamente de informações sensíveis do usuário lendo-as da superfície de uma tela virtual criada por ele, os apps podem iniciar as próprias atividades somente em uma tela virtual de criação no Android 10. No entanto:

  • Os componentes do sistema com a permissão INTERNAL_SYSTEM_WINDOW podem ser iniciados em qualquer tela.
  • Os autores de chamadas com a permissão ACTIVITY_EMBEDDING podem iniciar atividades de outros apps que têm a flag ActivityInfo.FLAG_ALLOW_EMBEDDED.
  • O lançamento de atividades em telas particulares é permitido apenas para o proprietário ou atividades presentes nessa tela.

Restrições semelhantes se aplicam à adição de janelas às telas.

O Android 10 inclui o método ActivityManager#isActivityStartAllowedOnDisplay(Context context, int displayId, Intent intent) para verificar as restrições de segurança do app antes de tentar iniciar em uma tela. No Android 9 e versões mais antigas, os resultados de inicialização restritos geram SecurityException.

A maioria das restrições de segurança é aplicada no método ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay().