O comportamento de inicialização de atividades é definido por modos de inicialização nos arquivos
AndroidManifest.xml de apps, flags de intent e ActivityOptions
fornecidos pelo caller. Use ActivityOption#setLaunchDisplayId(int) para
segmentar uma tela específica para o início da atividade.
- Por padrão, a atividade é iniciada na mesma tela que o autor da chamada. Por exemplo, uma nova instância de uma atividade iniciada no iniciador deve ser colocada na mesma tela sem flags ou opções adicionais. Use o contexto correto (atividade x aplicativo) para iniciar.
- Se a inicialização for feita de uma origem não associada a uma tela específica (como um shell ou contexto de aplicativo), a atividade será colocada na tela superior 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 em uma instância de atividade
existente no sistema. Nesse caso, se nenhuma flag adicional for fornecida, uma atividade vai aparecer 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 permitido por 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 na superfície de uma tela virtual criada por ele, os apps podem iniciar as próprias atividades somente em uma tela virtual criada por eles no Android 10. No entanto:
- Os componentes do sistema com a permissão
INTERNAL_SYSTEM_WINDOWpodem ser iniciados em qualquer tela. - Os chamadores com a permissão
ACTIVITY_EMBEDDINGpodem iniciar atividades de outros apps que têm a flagActivityInfo.FLAG_ALLOW_EMBEDDED. - O início de atividades em telas particulares só é permitido para o proprietário ou atividades presentes nessa tela.
Restrições semelhantes se aplicam à adição de janelas a 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 iniciá-lo em uma tela. No Android 9
(e versões anteriores), os resultados de inicialização restrita geram SecurityException.
A maioria das restrições de segurança é aplicada no método
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay().