Screen Continuity è un meccanismo Android che garantisce una transizione fluida dell'app tra lo stato piegato e dispiegato di un dispositivo pieghevole. Durante il dispiegamento, lo schermo cambia le sue dimensioni fisiche e il sistema riavvia l'Activity con nuove configurazioni. Secondo Google Developer, 2025, una corretta gestione della continuità migliora l'esperienza utente del 40% e riduce i reclami sulla perdita di stato. L'API ScreenContinuity fa parte di Jetpack WindowManager a partire dalla versione 1.1 e consente allo sviluppatore di gestire il ciclo di vita quando cambia la postura del dispositivo.
Punti chiave
Screen Continuity è un meccanismo Android che preserva lo stato dell'Activity quando la configurazione fisica dello schermo cambia sui dispositivi pieghevoli. Quando l'utente dispiega o piega il telefono, il sistema può riavviare l'Activity con nuove dimensioni della finestra. La continuità impedisce la perdita di dati inseriti, posizione di scorrimento e schermata corrente.
A differenza di una semplice rotazione dello schermo dove Android ricrea semplicemente l'Activity con un nuovo orientamento, i dispositivi pieghevoli introducono scenari fondamentalmente nuovi. La postura HALF_OPENED consente all'app di funzionare su mezzo schermo, mentre FLAT opera in modalità tablet completamente dispiegata. Senza il supporto di Screen Continuity, ogni cambio di postura reimposta l'interfaccia allo stato iniziale.
Secondo Google I/O 2024, più del 62% degli utenti di dispositivi pieghevoli ha incontrato app che gestiscono in modo errato il cambio di stato. Screen Continuity risolve questo problema a livello di API, fornendo allo sviluppatore strumenti pronti per salvare e ripristinare l'interfaccia utente.
Jetpack WindowManager definisce tre posture di base per i dispositivi pieghevoli attraverso la classe FoldingFeature. Ogni postura corrisponde a una specifica posizione fisica della cerniera e richiede una gestione speciale dell'interfaccia.
Il dispositivo è a un angolo da 30 a 160 gradi. Lo schermo è diviso in due aree logiche. L'app può visualizzare contenuti sulla metà superiore e controlli sulla metà inferiore. La modalità tabletop per videochiamate e lettori multimediali utilizza questa postura.
Il dispositivo è aperto a 180 gradi, formando un unico grande schermo. L'app passa alla modalità tablet con un'area di lavoro ampliata. In questa postura, si consiglia di mostrare un layout multi-pannello con un pannello di navigazione e contenuti dettagliati affiancati.
Il dispositivo poggia su una superficie a un angolo di circa 120 gradi. La metà inferiore dello schermo funge da pannello tattile o tastiera. La modalità touchpad in questa postura consente di emulare un trackpad sulla parte inferiore dello schermo.
Android gestisce i cambiamenti di configurazione dei dispositivi pieghevoli attraverso il meccanismo dei configuration changes. Quando l'utente dispiega il telefono, il sistema rileva il cambiamento di dimensione della finestra e avvia il ciclo standard di ricreazione dell'Activity. Screen Continuity intercetta questo processo e salva i dati chiave.
Il metodo principale per salvare lo stato è onRetainNonConfigurationInstance, che viene chiamato prima che l'Activity venga distrutta. Lo sviluppatore vi salva il modello dati, la posizione dell'elenco e la schermata di navigazione corrente. Dopo la ricreazione, l'Activity riceve questi dati tramite getLastNonConfigurationInstance e ripristina l'interfaccia esattamente come prima della piegatura.
Per i Fragment, il meccanismo è implementato tramite setRetainInstance(true), che impedisce la distruzione del fragment durante i cambiamenti di configurazione. In Jetpack Compose si usa rememberSaveable, che salva automaticamente lo stato quando cambiano le Window Metrics.
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 versione 1.1+ include la classe ScreenContinuityController, che fornisce meccanismi pronti per gestire la continuità dello schermo. L'API gestisce automaticamente i cambiamenti di postura e notifica l'app attraverso interfacce callback.
La classe centrale che registra gli ascoltatori di cambiamento di postura. registerContinuityListener accetta un callback che si attiva a ogni transizione tra gli stati del dispositivo pieghevole. Il controller fornisce anche informazioni sulla postura corrente tramite il metodo getCurrentFoldingFeature.
Una classe di utilità per trasformare i dati FoldingFeature in stati leggibili dall'app. FoldingFeatureAdapter normalizza le coordinate della cerniera e determina se la postura corrente è HALF_OPENED, FLAT o TABLE_TOP. Questo evita allo sviluppatore di calcolare manualmente angoli e soglie.
Per le app Compose, WindowManager fornisce WindowSizeClass e modificatori che tengono conto della piega. Il componente BoxWithConstraints si adatta ai cambiamenti di dimensione dello schermo in tempo reale senza ricreazione dell'Activity. Compose attiva automaticamente la ricomposizione quando cambiano le WindowMetrics.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Vediamo un esempio completo di Activity con supporto di Screen Continuity. MainActivity gestisce tre scenari: piegatura, dispiegamento e stato semipiegato. I dati vengono salvati tramite onRetainNonConfigurationInstance e ripristinati alla ricreazione.
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
)
L'elemento chiave è la classe ContinuityState, che memorizza l'elenco degli elementi e la posizione di scorrimento. L'Activity la salva prima della ricreazione e la ripristina immediatamente dopo la chiamata a onCreate. Il controller WindowManager si sottoscrive ai cambiamenti di postura e commuta il layout tra le modalità.
Android Studio fornisce un emulatore di dispositivo pieghevole con supporto per tutte e tre le posture. Per testare Screen Continuity, basta creare un dispositivo virtuale di tipo Pixel Fold o Samsung Galaxy Z Fold e cambiare postura tramite il pannello di controllo dell'emulatore.
Crea un AVD con la categoria Foldable e seleziona una risoluzione dello schermo da 7,6 pollici. Nei controlli estesi dell'emulatore, apri la scheda Folding Postures e passa da una postura all'altra. Ogni passaggio attiva un configuration change che l'app deve gestire correttamente.
Su un dispositivo reale (Galaxy Z Fold 5, Pixel Fold), il test viene eseguito piegando e dispiegando fisicamente. Le modalità Samsung DeX e Multi-Window attivano anch'esse la continuità. Per il debug, usa il comando ADB adb shell dumpsys window policy, che mostra lo stato attuale della piega.
Gli errori principali includono la perdita di stato della RecyclerView, il reset del testo nei campi di testo e la chiusura delle finestre di dialogo. ViewModel risolve questi problemi mantenendo i dati in memoria indipendentemente dal ciclo di vita dell'Activity. È importante anche annotare l'Activity nel manifest con il parametro android:configChanges se l'app gestisce manualmente i cambiamenti.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Domande frequenti
Screen Continuity salva lo stato durante i cambiamenti fisici delle dimensioni dello schermo, non solo durante la rotazione. Il normale onSaveInstanceState non garantisce la conservazione dello stato quando si cambiano le posture del dispositivo pieghevole, mentre ScreenContinuityController gestisce questo scenario specifico.
Tutti i dispositivi pieghevoli con Android 10+ e Google Play Services. Il supporto è incluso in Pixel Fold, serie Galaxy Z Fold, Huawei Mate X, Oppo Find N e OnePlus Open. Richiede Jetpack WindowManager versione 1.1 o superiore.
Jetpack Compose supporta Screen Continuity tramite rememberSaveable e WindowSizeClass. La composizione risponde automaticamente ai cambiamenti di WindowMetrics e rememberSaveable preserva lo stato tra le ricomposizioni. Il modificatore onSizeChanged consente di tracciare i cambiamenti di dimensione in tempo reale.
Quando il dispositivo viene dispiegato o piegato, l'Activity viene ricreata senza salvare lo stato. L'utente perde i dati inseriti, lo scorrimento viene resettato e i dialoghi aperti si chiudono. Ciò porta a recensioni negative e a una valutazione inferiore dell'app su Google Play.
Android Emulator supporta la simulazione di dispositivi pieghevoli. Crea un AVD di tipo Pixel Fold, apri Extended Controls e seleziona la scheda Folding Postures. Il cambio di postura attiva un configuration change, consentendo di testare la conservazione dello stato senza un dispositivo fisico.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche