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 aplicativo), a atividade será colocada na tela superior em que o usuário interagiu pela última vez com o dispositivo ou em que 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 outra sinalização 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 vai ser movida para ela (se permitido pelas restrições de segurança e outras).
Restrições de segurança
Para evitar que um app malicioso aprofunde informações sensíveis ao usuário ao lê-las na superfície de uma tela virtual criada por ele, os apps podem iniciar as próprias atividades somente em uma tela virtual criada 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 flagActivityInfo.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 anteriores), os resultados de inicialização restrito geram SecurityException
.
A maioria das restrições de segurança é aplicada no
método ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
.