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 redimensionar e funcionar em diferentes telas e o sistema precisa controlar onde localizar os 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, recomendamos 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 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. Disponível em 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 (iniciador, papel de parede,
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 a identificação da tela
no atributo de nome, que, para uma tela simulada, é overlay:1
.
Para uma tela integrada, um valor de exemplo pode ser "local:45354385242535243453"
.
Outra opção é usar informações de 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: