Práticas recomendadas

Aplicativos para dispositivos dobráveis ​​e com múltiplas telas

Geralmente, 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 aplicativos devem ser redimensionados e funcionar em telas diferentes e o sistema deve controlar onde localizar os aplicativos. Por exemplo, para construir uma experiência nova e única para dispositivos dobráveis ​​e lançar um aplicativo especial na tela externa quando o dispositivo estiver dobrado.

Nesse caso, o SystemUI (ou outro componente do sistema) deve detectar a dobra, determinar se é apropriado executar uma ação e, em seguida, iniciar a atividade de destino e especificar um ID de exibição externo como o destino de inicialização. Os aplicativos não devem detectar essa ação ou executar qualquer ação em resposta e, em seguida, executar a inicialização em uma tela específica. Em outras palavras, não presuma que o que funciona em um dispositivo funcionará em outros dispositivos. Resumindo, o código específico do dispositivo aumenta a fragmentação.

Restringir o acesso aos monitores

Se a configuração do dispositivo exigir a restrição de acesso a um ou mais monitores, a recomendação é usar o sinalizador Display#FLAG_PRIVATE para designar tais monitores como private . Isso restringe todos, exceto o proprietário, de adicionar conteúdo à exibição. Qualquer tentativa de iniciar uma atividade ou adicionar uma janela por qualquer pessoa que não seja o proprietário resulta em SecurityException . Se o sistema for proprietário da exibição, o sistema poderá adicionar janelas e iniciar atividades.

Além disso, as entidades colocadas em uma exibição sempre podem acessar essa exibição. Se o proprietário iniciar uma atividade em uma tela, a atividade poderá iniciar outras atividades nessa tela. Como resultado, o proprietário é responsável por restringir o acesso e permitir apenas aplicativos confiáveis.

Além disso, mais restrições são adicionadas às exibições virtuais porque qualquer aplicativo pode criar uma sem torná-la visível para o usuário. Se o display virtual não pertencer ao sistema, somente atividades com allowEmbedded serão permitidas e o chamador deverá ter a permissão ACTIVITY_EMBEDDING .

Para mais informações, veja:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

Para controlar condicionalmente os lançamentos de atividades, use LaunchParamsController , que intercepta todos os lançamentos de atividades e permite que um componente do sistema modifique os parâmetros usados ​​para lançamento. Isso está disponível em system_server .

Definir configurações de janelas de exibição e 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 .

Este 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 exibição. Para obter detalhes, consulte DisplayWindowSettings#shouldShowSystemDecorsLocked() e DisplayWindowSettings#shouldShowImeLocked() .

Para identificar o monitor, use um ID exclusivo (este padrão usa DisplayInfo#uniqueId ) ou um ID de porta física para monitores de hardware (consulte DisplayInfo#address ).

Por exemplo, o seguinte exemplo de configuração de exibição permite decorações do sistema e o IME em uma exibição 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 name, que para uma exibição simulada é overlay:1 . Para um display integrado, um valor de amostra pode ser "local:45354385242535243453" . Outra opção é usar as informações da porta de hardware e definir identifier="1" para corresponder a DisplayWindowSettings#IDENTIFIER_PORT e depois 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 obter detalhes, consulte Identificadores de exibição estáticos .

Para mais informações, veja: