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: