Práticas recomendadas

Aplicativos para dispositivos dobráveis ​​e com várias telas

Geralmente, os aplicativos não devem depender de identificadores estáticos ou lógica que depende 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 criar uma experiência nova e única para dispositivos dobráveis ​​e lançar um aplicativo especial na tela externa quando o dispositivo for dobrado.

Nesse caso, 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 assuma que o que funciona em um dispositivo funcionará em outros dispositivos. Em suma, o código específico do dispositivo aumenta a fragmentação.

Restringindo o acesso a 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 esses monitores como privados . 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 uma SecurityException . Se o sistema for o proprietário do monitor, 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 telas virtuais porque qualquer aplicativo pode criar uma sem torná-la visível para o usuário. Se a exibição virtual não for de propriedade do 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 atividade, use LaunchParamsController , que intercepta todos os lançamentos de atividade e permite que um componente do sistema modifique os parâmetros usados ​​para lançamento. Isso está disponível em system_server .

Configurando as configurações das janelas de exibição e as decorações do sistema

As decorações do sistema podem ser configuradas por monitor 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 obter detalhes, consulte DisplayWindowSettings#shouldShowSystemDecorsLocked() e DisplayWindowSettings#shouldShowImeLocked() .

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

Por exemplo, o exemplo de configuração de exibição a seguir habilita as 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 uma tela integrada, um valor de amostra pode ser "local:45354385242535243453" . Outra opção é usar as informações da porta de hardware e definir o identifier="1" para corresponder a DisplayWindowSettings#IDENTIFIER_PORT e, em seguida, 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ática .

Para mais informações, veja: