Práticas recomendadas

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: