As telas conectadas estendem a experiência do Modo Janela para Computador a smartphones comuns, dando aos usuários acesso a telas grandes em dispositivos móveis. Esse recurso abre novas possibilidades para interação com apps e produtividade do usuário.
Todos os recursos exclusivos do Modo Janela para Computador se aplicam às telas conectadas. Quando você conecta um smartphone a uma tela, o estado do smartphone permanece inalterado, e uma sessão de computador em branco é iniciada na tela conectada. O dispositivo e a tela funcionam como dois sistemas individuais, com apps específicos para cada tela.
Se você conectar um dispositivo compatível com o modo janela para computador, como um tablet, a um monitor externo, a sessão de computador será estendida para as duas telas. Os dois monitores funcionam como um sistema contínuo. Essa configuração permite que janelas, conteúdo e o cursor se movam livremente entre os dois monitores.
Para oferecer suporte a telas conectadas de maneira eficaz, é preciso prestar atenção a vários aspectos do design e da implementação do app. As práticas recomendadas a seguir garantem uma experiência do usuário tranquila e produtiva.
Processar mudanças dinâmicas de exibição
Muitos apps são criados com a premissa de que o objeto Display e as características dele não vão mudar durante o ciclo de vida do app. No entanto, quando um usuário conecta ou desconecta um monitor externo ou até mesmo move uma janela de app entre telas, o objeto Display associado ao contexto ou à janela do app pode mudar. As propriedades da tela, como tamanho, resolução, taxa de atualização, compatibilidade com HDR e densidade, podem ser diferentes. Se você codificar valores com base na tela do smartphone, por exemplo, é provável que os layouts sejam interrompidos em uma tela externa.
As telas externas também podem ter densidades de pixels muito diferentes. É necessário garantir que o app responda corretamente a mudanças de densidade. Isso envolve usar pixels de densidade independente (dp) para layouts, fornecer recursos específicos de densidade e garantir que a interface do usuário seja dimensionada adequadamente.
Se uma atividade estiver sendo executada em uma tela externa quando ela for desconectada, o sistema vai mover a atividade para a tela principal. A ação aciona mudanças de configuração, como alterações no tamanho e na densidade da tela, que podem fazer com que a atividade seja recriada. O app precisa processar a mudança de configuração salvando e restaurando o estado da interface para evitar perda de dados ou uma experiência confusa para o usuário.
Use o contexto certo
Usar o contexto certo é fundamental quando se usa várias telas. Ao acessar recursos, o contexto da atividade (exibido) é diferente do contexto do app (que não é exibido).
O contexto da atividade contém informações sobre a tela e é sempre ajustado para a área da tela em que a atividade aparece. Isso permite que você tenha as informações corretas sobre a densidade de exibição ou as métricas de janela do app. Use sempre o contexto da atividade ou outro contexto baseado na interface para acessar informações sobre a janela ou tela atual. Isso também afeta algumas APIs do sistema que usam informações do contexto.
No Jetpack Compose, é possível acessar informações específicas da tela usando objetos CompositionLocal, como LocalConfiguration.current e LocalDensity.current. Quando uma atividade ou janela é movida entre telas, a configuração do dispositivo muda, acionando a recomposição com novas métricas de exibição. Os objetos CompositionLocal permitem que a interface se adapte sem problemas.
Receber informações de exibição
Use a classe Display para acessar informações como tamanho de exibição, densidade ou flags. Use o serviço do sistema DisplayManager para acessar as telas disponíveis. Para identificar telas externas, filtre o Display.DEFAULT_DISPLAY, que geralmente é a tela integrada do smartphone ou tablet:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
Gerenciar o início e a configuração da atividade
Com telas conectadas, os apps podem especificar em qual tela um app precisa ser executado quando for iniciado ou quando criar outra atividade. Esse comportamento depende do modo de inicialização da atividade definido no arquivo de manifesto, bem como das sinalizações de intents e opções definidas pela entidade que está iniciando a atividade.
Quando uma atividade é movida para uma tela secundária, o app pode passar por uma atualização de contexto, redimensionamento de janela e mudanças de configuração e recursos. Se a atividade processar a mudança de configuração, ela será notificada em onConfigurationChanged(). Caso contrário, a atividade será reiniciada.
Se o modo de inicialização selecionado para uma atividade permitir várias instâncias, a inicialização em uma tela secundária poderá criar uma nova instância da atividade. As duas atividades são retomadas ao mesmo tempo, o que pode ser útil em determinados cenários de multitarefa.
Você pode iniciar uma atividade em uma tela específica usando ActivityOptions. O launchDisplayId requer o Android 8 (nível 26 da API) ou versões mais recentes.
// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
.firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
?.displayId
// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
val intent = Intent(this, MySecondaryActivity::class.java)
val options = ActivityOptions.makeBasic()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.launchDisplayId = externalDisplayId
}
startActivity(intent, options.toBundle())
} else {
// Optionally, handle the case where no external display is connected.
}
Evite listas de permissões de dispositivos
Às vezes, os apps restringem a interface e os recursos de tela grande a dispositivos selecionados usando uma lista de permissões ou verificando BUILD.MODEL e o tamanho de exibição integrado. Essa abordagem não é eficaz para telas conectadas porque praticamente qualquer dispositivo pode ser conectado a uma tela grande, e o modelo do dispositivo não muda quando uma tela externa é conectada.
Em vez de usar listas de permissão ou verificar BUILD.MODEL e o tamanho de exibição integrado, verifique as métricas da janela ou os recursos do dispositivo no momento da execução para tomar decisões sobre a interface. Use as APIs do Jetpack WindowManager ou as classes de tamanho de janela para criar layouts responsivos e adaptáveis para vários tamanhos e densidades de tela.
Suporte a periféricos externos
Quando os usuários se conectam a uma tela externa, eles geralmente criam um ambiente mais parecido com um computador. Isso geralmente envolve o uso de teclados, mouses, trackpads, webcams, microfones e alto-falantes externos. É preciso garantir que o app funcione perfeitamente com esses periféricos. Isso inclui o processamento de atalhos de teclado, o gerenciamento de interações do ponteiro do mouse, o suporte correto a câmeras ou microfones externos e o respeito ao roteamento de saída de áudio. Para mais detalhes, consulte Compatibilidade de entrada em telas grandes.
Aumentar a produtividade do usuário
As telas conectadas oferecem uma oportunidade significativa de melhorar a produtividade do usuário. Agora você tem as ferramentas para criar apps para dispositivos móveis que podem oferecer experiências comparáveis aos aplicativos para computador. Considere implementar os seguintes recursos para aumentar a produtividade do usuário:
- Permite que os usuários abram várias instâncias do mesmo app. Isso é muito útil para tarefas como comparar documentos, gerenciar diferentes conversas ou visualizar vários arquivos simultaneamente.
- Permita que os usuários compartilhem dados avançados dentro e fora do app com arrastar e soltar.
- Ajude os usuários a manter o fluxo de trabalho em todas as mudanças de configuração implementando um sistema de gerenciamento de estado robusto.
Ao seguir estas diretrizes e usar os exemplos de código fornecidos, você pode criar apps que se adaptam perfeitamente a telas conectadas, oferecendo aos usuários uma experiência mais completa e produtiva.