Apps para dispositivos dobráveis e multitela
No geral, os aplicativos não devem depender de identificadores estáticos ou de lógica que dependa 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 um experiência nova e única para dispositivos dobráveis e lançar um app especial na tela externa quando o dispositivo estiver dobrado.
Nesse caso, o SystemUI (ou outro componente do sistema) deve detectar o dobre, determine se é apropriado realizar uma ação e, em seguida, inicie atividade de destino e especificar um ID de tela externo como destino da inicialização. Os apps não podem detectar essa ação nem realizar nenhuma ação em resposta executar o lançamento em uma tela específica. Em outras palavras, não presuma que o que funciona em um dispositivo vai funcionar em outros. Resumindo, configurações específicas do dispositivo o código 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 restringe tudo, exceto o
de adicionar conteúdo à tela. Qualquer tentativa de iniciar uma atividade
adicionar uma janela por qualquer pessoa, exceto o proprietário, resultará 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 acessá-la. Se o proprietário iniciar uma atividade em uma tela, ela poderá iniciar outros atividades nesta tela. Como resultado, o proprietário é responsável por restringir 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 estiver
de propriedade do sistema, somente as atividades
allowEmbedded
são permitidos, e o autor da chamada precisa ter a permissão ACTIVITY_EMBEDDING
permissão.
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 atividade e permite que um componente do sistema modifique a
parâmetros usados para o lançamento. Esse recurso está disponível em system_server
.
Definir as configurações de janela de exibição e decorações do sistema
As decorações do sistema podem
ser configurados por tela em DisplayWindowSettings
. Uma implementação
de dispositivo pode fornecer uma configuração padrão em
/data/system/display_settings.xml
.
Este 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 acessar detalhes, consulte DisplayWindowSettings#shouldShowSystemDecorsLocked()
e DisplayWindowSettings#shouldShowImeLocked()
.
Para identificar a tela, use um ID exclusivo (esse padrão usa
DisplayInfo#uniqueId
) ou um ID de porta física para hardware
(consulte DisplayInfo#address
).
Por exemplo, o exemplo de configuração de exibição a seguir ativa decorações do sistema e a 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 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 da porta de hardware e definir identifier="1"
para corresponder a DisplayWindowSettings#IDENTIFIER_PORT
e atualizar
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 exibição estáticos.
Para mais informações, consulte: