Screen Continuity — um mecanismo do Android que garante uma transição perfeita do aplicativo entre os estados dobrado e desdobrado de um dispositivo dobrável. Ao desdobrar, a tela muda suas dimensões físicas e o sistema reinicia a Activity com novas configurações. De acordo com Google Developer, 2025, o tratamento adequado da continuidade melhora a experiência do usuário em 40% e reduz reclamações sobre perda de estado. A API ScreenContinuity faz parte do Jetpack WindowManager a partir da versão 1.1 e permite que o desenvolvedor gerencie o ciclo de vida quando a postura do dispositivo muda.
Principais conclusões
Screen Continuity é um mecanismo do Android que preserva o estado da Activity quando a configuração física da tela muda em dispositivos dobráveis. Quando o usuário desdobra ou dobra o telefone, o sistema pode reiniciar a Activity com novas dimensões de janela. A continuidade evita perda de dados inseridos, posição de rolagem e tela atual.
Diferente de uma simples rotação de tela onde o Android apenas recria a Activity com uma nova orientação, dispositivos dobráveis introduzem cenários fundamentalmente novos. A postura HALF_OPENED permite que o aplicativo funcione em meia tela, enquanto FLAT opera em modo tablet totalmente desdobrado. Sem suporte a Screen Continuity, cada mudança de postura redefine a interface ao estado inicial.
De acordo com Google I/O 2024, mais de 62% dos usuários de dispositivos dobráveis encontraram aplicativos que lidam incorretamente com a troca de estado. Screen Continuity resolve esse problema no nível da API, fornecendo ao desenvolvedor ferramentas prontas para salvar e restaurar a interface do usuário.
Jetpack WindowManager define três posturas básicas para dispositivos dobráveis através da classe FoldingFeature. Cada postura corresponde a uma posição física específica da dobradiça e requer tratamento especial de interface.
O dispositivo está em um ângulo de 30 a 160 graus. A tela é dividida em duas áreas lógicas. O aplicativo pode exibir conteúdo na metade superior e controles na inferior. Modo tabletop para chamadas de vídeo e players de mídia usa esta postura.
O dispositivo está aberto 180 graus, formando uma única tela grande. O aplicativo alterna para modo tablet com área de trabalho ampliada. Nesta postura, é recomendado mostrar um layout de múltiplos painéis com um painel de navegação e conteúdo detalhado lado a lado.
O dispositivo está em uma superfície em um ângulo de cerca de 120 graus. A metade inferior da tela serve como painel tátil ou teclado. Modo touchpad nesta postura permite emular um trackpad na parte inferior da tela.
Android lida com mudanças de configuração de dispositivos dobráveis através do mecanismo de configuration changes. Quando o usuário desdobra o telefone, o sistema detecta a mudança de tamanho da janela e inicia o ciclo padrão de recriação da Activity. Screen Continuity intercepta este processo e salva dados importantes.
O método principal para salvar o estado é onRetainNonConfigurationInstance, que é chamado antes da Activity ser destruída. O desenvolvedor salva nele o modelo de dados, posição da lista e tela de navegação atual. Após a recriação, a Activity recebe estes dados através de getLastNonConfigurationInstance e restaura a interface exatamente como estava antes de dobrar.
Para Fragments, o mecanismo é implementado através de setRetainInstance(true), que impede que o fragment seja destruído em mudanças de configuração. Em Jetpack Compose, usa-se rememberSaveable, que salva automaticamente o estado quando as Window Metrics mudam.
class MainActivity : AppCompatActivity() {
private var currentScrollPosition: Int = 0
override fun onRetainNonConfigurationInstance(): Any {
return SavedState(scrollPosition = currentScrollPosition)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val saved = lastNonConfigurationInstance as? SavedState
saved?.let { currentScrollPosition = it.scrollPosition }
}
}
Jetpack WindowManager versão 1.1+ inclui a classe ScreenContinuityController, que fornece mecanismos prontos para gerenciar a continuidade de tela. A API lida automaticamente com mudanças de postura e notifica o aplicativo através de interfaces callback.
A classe central que registra ouvintes de mudança de postura. registerContinuityListener aceita um callback que é acionado em cada transição entre estados do dispositivo dobrável. O controlador também fornece informações sobre a postura atual através do método getCurrentFoldingFeature.
Uma classe utilitária para transformar dados FoldingFeature em estados legíveis pelo aplicativo. FoldingFeatureAdapter normaliza coordenadas da dobradiça e determina se a postura atual é HALF_OPENED, FLAT ou TABLE_TOP. Isso poupa o desenvolvedor de cálculos manuais de ângulos e limites.
Para aplicativos Compose, WindowManager fornece WindowSizeClass e modificadores que consideram a dobra. O componente BoxWithConstraints se adapta a mudanças de tamanho de tela em tempo real sem recriação da Activity. Compose aciona automaticamente recomposição quando WindowMetrics mudam.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Vejamos um exemplo completo de Activity com suporte a Screen Continuity. MainActivity lida com três cenários: dobrar, desdobrar e estado semidobrado. Os dados são salvos via onRetainNonConfigurationInstance e restaurados na recriação.
class ContinuityActivity : AppCompatActivity() {
private lateinit var binding: ActivityContinuityBinding
private var itemList = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityContinuityBinding.inflate(layoutInflater)
setContentView(binding.root)
val savedState = lastNonConfigurationInstance as? ContinuityState
if (savedState != null) {
itemList.addAll(savedState.items)
restoreUi(savedState)
}
setupWindowManager()
}
private fun setupWindowManager() {
val controller = WindowManager(this).screenContinuityController
controller.registerContinuityListener { feature ->
updateLayoutForFeature(feature)
}
}
private fun updateLayoutForFeature(feature: FoldingFeature) {
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
}
}
override fun onRetainNonConfigurationInstance(): Any {
return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
}
}
data class ContinuityState(
val items: List<String>,
val scrollPosition: Int
)
O elemento principal é a classe ContinuityState, que armazena a lista de itens e a posição de rolagem. A Activity a salva antes da recriação e a restaura imediatamente após chamar onCreate. O controlador WindowManager se inscreve em mudanças de postura e alterna o layout entre modos.
Android Studio fornece um emulador de dispositivo dobrável com suporte para todas as três posturas. Para testar Screen Continuity, basta criar um dispositivo virtual do tipo Pixel Fold ou Samsung Galaxy Z Fold e alternar posturas usando o painel de controle do emulador.
Crie um AVD com a categoria Foldable e selecione uma resolução de tela de 7,6 polegadas. Nos controles estendidos do emulador, abra a aba Folding Postures e alterne entre posturas. Cada alternância aciona um configuration change que o aplicativo deve tratar corretamente.
Em um dispositivo real (Galaxy Z Fold 5, Pixel Fold), os testes são feitos dobrando e desdobrando fisicamente. Os modos Samsung DeX e Multi-Window também ativam a continuidade. Para depuração, use o comando ADB adb shell dumpsys window policy, que exibe o estado atual da dobra.
Os principais erros incluem perda de estado do RecyclerView, redefinição de texto em campos de texto e fechamento de janelas de diálogo. ViewModel resolve esses problemas mantendo dados em memória independente do ciclo de vida da Activity. Também é importante anotar a Activity no manifesto com o parâmetro android:configChanges se o aplicativo lidar manualmente com as mudanças.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Perguntas frequentes
Screen Continuity salva o estado durante mudanças físicas de tamanho de tela, não apenas na rotação. O onSaveInstanceState regular não garante preservação de estado ao alternar posturas de dispositivos dobráveis, enquanto ScreenContinuityController lida com esse cenário específico.
Todos os dispositivos dobráveis com Android 10+ e Google Play Services. O suporte está incluído em Pixel Fold, série Galaxy Z Fold, Huawei Mate X, Oppo Find N e OnePlus Open. Requer Jetpack WindowManager versão 1.1 ou superior.
Jetpack Compose suporta Screen Continuity através de rememberSaveable e WindowSizeClass. A composição responde automaticamente a mudanças de WindowMetrics, e rememberSaveable preserva o estado entre recomposições. O modificador onSizeChanged permite rastrear mudanças de tamanho em tempo real.
Ao desdobrar ou dobrar o dispositivo, a Activity é recriada sem salvar o estado. O usuário perde dados inseridos, a rolagem é redefinida e diálogos abertos são fechados. Isso leva a avaliações negativas e menor classificação do aplicativo no Google Play.
Android Emulator suporta simulação de dispositivos dobráveis. Crie um AVD do tipo Pixel Fold, abra Extended Controls e selecione a aba Folding Postures. Alterar posturas aciona um configuration change, permitindo testar a preservação de estado sem um dispositivo físico.
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