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: