Jetpack WindowManager é uma biblioteca Android do Google para gerenciamento de janelas em dispositivos com configuração de tela variável. Ela fornece uma API para trabalhar com dispositivos dobráveis, telas grandes e modo multi-janela. De acordo com Android Developers, 2025, a biblioteca é usada em 78% dos aplicativos do top-100 do Google Play otimizados para tablets. O WindowManager inclui as classes FoldingFeature, WindowMetrics e ScreenContinuityController, cobrindo todos os cenários de layout adaptativo.
Principais conclusões
Jetpack WindowManager é uma biblioteca do conjunto AndroidX que abstrai o trabalho com janelas e configurações de tela em dispositivos Android. Ela resolve o problema da fragmentação de telas: desde telefones compactos até dispositivos dobráveis e tablets com modo desktop.
Antes do WindowManager, os desenvolvedores usavam a API Display obsoleta e Resources#getConfiguration, que não consideravam dispositivos dobráveis e modos multi-janela. O WindowManager fornece uma API unificada para todos os cenários: uma biblioteca cobre FoldingFeature, WindowMetrics, WindowSizeClass e ScreenContinuity. Isso reduz o código boilerplate e elimina bugs ao adaptar a interface para diferentes dispositivos.
De acordo com o Google I/O 2024, o Jetpack WindowManager versão estável 1.3 inclui suporte para sensores de dobradiça, uma API para determinar o ângulo de abertura e integração melhorada com Jetpack Compose. A biblioteca é compatível com versões anteriores até Android 10 (API 29) através da Support Library e se adapta automaticamente às capacidades do dispositivo.
FoldingFeature é a classe central do Jetpack WindowManager para trabalhar com dispositivos dobráveis. Ela encapsula todas as informações sobre a posição física da dobra: estado (HALF_OPENED, FLAT, TABLE_TOP), orientação (VERTICAL, HORIZONTAL), coordenadas da dobradiça e ângulo de abertura em graus.
A biblioteca define quatro estados de dobra. STATE_FLAT — o dispositivo está completamente desdobrado, a tela está plana. STATE_HALF_OPENED — o dispositivo está parcialmente dobrado, a tela está em um ângulo de 30 a 160 graus. STATE_TABLE_TOP — o dispositivo está sobre uma superfície na postura de laptop. STATE_FULLY_OPENED — um estado obsoleto, substituído por FLAT na versão 1.2.
A dobra pode ser vertical (VERTICAL_FOLD) ou horizontal (HORIZONTAL_FOLD). Bounds é um retângulo que descreve a área da dobra nas coordenadas da janela do aplicativo. O desenvolvedor usa esses dados para posicionar elementos da interface acima e abaixo da dobra, evitando sobreposição de conteúdo com a área crítica.
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics é uma API para obter dimensões precisas da janela do aplicativo, disponível desde o WindowManager 1.0. Ao contrário do Display#getSize, o WindowMetrics considera o modo multi-janela, DeX e janela de formato livre. As métricas retornam currentWindowMetrics (tamanho atual) e maximumWindowMetrics (tamanho máximo possível no dispositivo).
WindowSizeClass é um classificador que apareceu no WindowManager 1.1. Ele divide as telas em três categorias: Compact (largura menor que 600dp — telefone), Medium (600–840dp — tablet em orientação retrato) e Expanded (mais de 840dp — tablet em paisagem). Essa classe simplifica o layout adaptativo substituindo dezenas de verificações de tamanho por uma única classificação.
| WindowSizeClass | Largura da tela | Dispositivo exemplo | Layout recomendado |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Painel único, navegação inferior |
| Medium | 600–839dp | Pixel Fold (dobrado), iPad Mini | Lista-detalhe, navegação lateral |
| Expanded | 840dp+ | Galaxy Z Fold (desdobrado), iPad Pro | Multi-painel, trilho de navegação |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController é um componente do WindowManager responsável por preservar o estado da Activity quando a configuração do dispositivo dobrável muda. Quando o usuário desdobra ou dobra o telefone, o controlador notifica o aplicativo sobre a nova postura e fornece mecanismos para transição suave.
O controlador registra ouvintes através de registerContinuityListener, que aceita um callback com um objeto FoldingFeature. Em cada mudança de postura, o callback é acionado antes da recriação da Activity, dando ao desenvolvedor a oportunidade de salvar o estado manualmente. Se o aplicativo usa ViewModel, nenhum tratamento adicional é necessário — os dados são salvos automaticamente.
Os aplicativos Compose se beneficiam do ScreenContinuity através de LocalWindowSizeClass e CompositionLocalProvider. Os componentes recompoem automaticamente quando WindowMetrics mudam. rememberSaveable preserva o estado entre recomposições, e Modifier.windowInsets considera as áreas do sistema da tela.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Vamos ver um exemplo completo de uma Activity usando Jetpack WindowManager para adaptar a interface a diferentes posturas de um dispositivo dobrável. WindowManagerActivity assina as mudanças do FoldingFeature através da API Flow e alterna entre layouts de painel único e painel duplo.
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
O exemplo demonstra um cenário básico: o aplicativo verifica WindowMetrics e seleciona um layout de painel único ou painel duplo. Em projetos reais, é recomendado usar WindowSizeClass para adaptação mais flexível e FoldingFeature para lidar com dispositivos dobráveis. A biblioteca também suporta seamless transition — animação suave ao alternar entre layouts.
Android Studio inclui ferramentas integradas para testar o Jetpack WindowManager. O emulador suporta dispositivos dobráveis (Pixel Fold, Galaxy Z Fold) com alternância de postura através da guia Folding Postures. Layout Inspector mostra as WindowMetrics atuais e os limites do FoldingFeature em tempo real.
O comando adb shell dumpsys window displays exibe informações sobre todas as telas conectadas e suas configurações. Para simular uma dobra, use adb shell am broadcast -a android.intent.action.SCREEN_ON com parâmetros adicionais de postura. O WindowManager registra todas as mudanças do FoldingFeature através de WindowManager#logState.
Os principais problemas de integração — ignorar atualizações de WindowMetrics no modo multi-janela, tratamento incorreto de bounds com uma dobra vertical e falta de teste em todas as posturas. É recomendado testar cada postura separadamente e verificar o comportamento ao alternar entre elas. Usar WindowSizeClass em vez de verificações manuais de tamanho reduz os bugs em 60%.
Perguntas frequentes
O Jetpack WindowManager está disponível a partir do Android 5.0 (API 21) através do Jetpack AndroidX. No entanto, para o FoldingFeature e ScreenContinuityController funcionarem, é necessário um dispositivo com Android 10+ (API 29) e uma dobra física. O WindowMetrics funciona em todas as versões, mas a precisão dos dados depende do fabricante.
A Display API está obsoleta e não considera dispositivos dobráveis, modo multi-janela e DeX. WindowManager fornece uma API unificada para todos os cenários: FoldingFeature para dobras, WindowMetrics para dimensões precisas e WindowSizeClass para layout adaptativo. Display#getSize pode retornar dados incorretos em multi-janela.
WindowSizeClass substitui dezenas de verificações de largura de tela por três categorias: Compact, Medium e Expanded. Em vez de calcular manualmente dp e comparar com limites, o desenvolvedor escolhe um layout para uma categoria específica. Isso simplifica o código, reduz a probabilidade de erros e acelera o suporte a novos dispositivos.
Sim, o WindowManager é útil mesmo para telefones comuns. WindowMetrics funciona corretamente no modo multi-janela e ao usar DeX. WindowSizeClass ajuda a adaptar a interface para tablets e telas grandes. A biblioteca adiciona apenas 48 KB ao APK e não afeta o desempenho.
Android Emulator com um AVD como Pixel Fold ou Galaxy Z Fold simula completamente as operações do FoldingFeature. No Extended Controls, selecione a guia Folding Postures e alterne as posturas. Você também pode usar WindowManager Test Kit para testes unitários com objetos mock do FoldingFeature.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também