Apps para dispositivos dobráveis e multitelas
Em geral, os apps não devem depender de identificadores estáticos ou de uma lógica que depende de alguns IDs de exibição. Na maioria dos casos, os apps precisam ser redimensionados e funcionar em diferentes telas, e o sistema precisa controlar a localização dos apps. Por exemplo, para criar uma experiência nova e exclusiva para dispositivos dobráveis e iniciar um app especial na tela externa quando o dispositivo estiver dobrado.
Nesse caso, o SystemUI (ou outro componente do sistema) precisa detectar a dobra, determinar se é apropriado realizar uma ação e, em seguida, iniciar a atividade de destino e especificar um ID de tela externa como o destino de inicialização. Os apps não podem detectar essa ação ou realizar qualquer ação em resposta e, em seguida, realizar a inicialização em uma tela específica. Em outras palavras, não presuma que o que funciona em um dispositivo vai funcionar em outros. Em resumo, o código específico do dispositivo aumenta a fragmentação.
Restringir o acesso às telas
Se a configuração do dispositivo exigir a restrição de acesso a uma ou mais
telas, a recomendação é usar a flag Display#FLAG_PRIVATE
para designar essas telas como privadas. Isso impede que todos, exceto o
proprietário, adicionem conteúdo à tela. Qualquer tentativa de iniciar uma atividade ou
adicionar uma janela por qualquer pessoa que não seja o proprietário resulta em uma SecurityException
.
Se o sistema for o proprietário da tela, ele poderá adicionar janelas e iniciar atividades.
Além disso, as entidades colocadas em uma tela sempre podem acessar essa tela. Se o proprietário iniciar uma atividade em uma tela, ela poderá iniciar outras atividades nessa tela. Por isso, o proprietário é responsável por restringir o acesso e permitir apenas apps confiáveis.
Além disso, mais restrições são adicionadas às telas virtuais porque qualquer app pode
criar uma sem que ela seja visível para o usuário. Se a tela virtual não
pertencer ao sistema, apenas atividades com
allowEmbedded
serão permitidas, e o autor da chamada precisará ter a permissão
ACTIVITY_EMBEDDING
.
Para mais informações, consulte:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Para controlar condicionalmente as inicializações de atividades, use LaunchParamsController
,
que intercepta todas as inicializações de atividades e permite que um componente do sistema modifique os
parâmetros usados para a inicialização. Esse recurso está disponível no system_server
.
Configurar as configurações de janelas de exibição e as decorações do sistema
As decorações do sistema podem
ser configuradas por exibição em DisplayWindowSettings
. Uma implementação
de dispositivo pode fornecer uma configuração padrão em
/data/system/display_settings.xml
.
Esse valor determina se as decorações do sistema (tela de início, plano de fundo,
barra de navegação e outras janelas de decoração) e o IME aparecem em uma tela.
Para mais detalhes, consulte DisplayWindowSettings#shouldShowSystemDecorsLocked()
e DisplayWindowSettings#shouldShowImeLocked()
.
Para identificar a tela, use um ID exclusivo (o padrão usa
DisplayInfo#uniqueId
) ou um ID de porta física para telas
de hardware (consulte DisplayInfo#address
).
Por exemplo, o exemplo de configuração de exibição a seguir ativa as decorações do sistema e o IME em uma tela simulada:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
No exemplo acima, uniqueId
é usado para identificação de exibição
no atributo de nome, que, para uma tela simulada, é overlay:1
.
Para uma tela integrada, um valor de amostra pode ser "local:45354385242535243453"
.
Outra opção é usar informações da porta de hardware e definir identifier="1"
para corresponder a DisplayWindowSettings#IDENTIFIER_PORT
e atualizar o
nome para usar o formato "port:<port_id>"
:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Para mais detalhes, consulte Identificadores de tela estática.
Para mais informações, consulte: