Práticas recomendadas

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: