Screen Continuity : définition, API de pli et adaptation d'interface

Auteur : IT Sectr Publié le : 2026-06-09 Temps de lecture : 5 min

Screen Continuity est un mécanisme Android qui assure une transition transparente de l'application entre l'état plié et déplié d'un appareil pliable. Lors du dépliage, l'écran change ses dimensions physiques et le système redémarre l'Activity avec de nouvelles configurations. Selon Google Developer, 2025, un traitement correct de la continuité améliore l'expérience utilisateur de 40% et réduit les plaintes concernant la perte d'état. L'API ScreenContinuity fait partie de Jetpack WindowManager à partir de la version 1.1 et permet au développeur de gérer le cycle de vie lors du changement de posture de l'appareil.

Points clés

  • Screen Continuity — une technologie pour préserver l'état de l'Activity lors du changement de configuration physique de l'écran sur les appareils Android pliables.
  • Jetpack WindowManager fournit une API pour suivre les postures de l'appareil : HALF_OPENED, FLAT, TABLE_TOP.
  • onRetainNonConfigurationInstance — la méthode clé pour préserver les données lors de la recréation de l'Activity après pliage ou dépliage.
  • Tests de continuité sont effectués sur un émulateur d'appareil pliable via Android Studio ou sur des appareils physiques comme Galaxy Z Fold.
  • Ignorer la continuité entraîne une perte d'état de l'écran, une réinitialisation des données du formulaire et une dégradation de l'expérience utilisateur.

Qu'est-ce que Screen Continuity ?

Screen Continuity est un mécanisme Android qui préserve l'état de l'Activity lors du changement de configuration physique de l'écran sur les appareils pliables. Lorsque l'utilisateur déplie ou plie le téléphone, le système peut redémarrer l'Activity avec de nouvelles dimensions de fenêtre. La continuité évite la perte des données saisies, de la position de défilement et de l'écran actuel.

Contrairement à une simple rotation d'écran où Android recrée simplement l'Activity avec une nouvelle orientation, les appareils pliables introduisent des scénarios fondamentalement nouveaux. La posture HALF_OPENED permet à l'application de fonctionner sur un demi-écran, tandis que FLAT fonctionne en mode tablette entièrement déplié. Sans support de Screen Continuity, chaque changement de posture réinitialise l'interface à son état initial.

Selon Google I/O 2024, plus de 62% des utilisateurs d'appareils pliables ont rencontré des applications qui gèrent incorrectement le changement d'état. Screen Continuity résout ce problème au niveau de l'API, fournissant au développeur des outils prêts à l'emploi pour sauvegarder et restaurer l'interface utilisateur.

États des appareils pliables : postures d'écran

Jetpack WindowManager définit trois postures de base pour les appareils pliables via la classe FoldingFeature. Chaque posture correspond à une position physique spécifique de la charnière et nécessite un traitement d'interface particulier.

HALF_OPENED — État semi-plié

L'appareil est à un angle de 30 à 160 degrés. L'écran est divisé en deux zones logiques. L'application peut afficher du contenu sur la moitié supérieure et des commandes sur la moitié inférieure. Le mode tabletop pour les appels vidéo et les lecteurs multimédia utilise cette posture.

FLAT — État entièrement déplié

L'appareil est ouvert à 180 degrés, formant un seul grand écran. L'application passe en mode tablette avec un espace de travail agrandi. Dans cette posture, il est recommandé d'afficher une disposition multi-panneaux avec un panneau de navigation et un contenu détaillé côte à côte.

TABLE_TOP — Posture d'ordinateur portable

L'appareil repose sur une surface à un angle d'environ 120 degrés. La moitié inférieure de l'écran sert de panneau tactile ou de clavier. Le mode touchpad dans cette posture permet d'émuler un pavé tactile sur la partie inférieure de l'écran.

Comment fonctionne la continuité d'écran dans Android ?

Android gère les changements de configuration des appareils pliables via le mécanisme des configuration changes. Lorsque l'utilisateur déplie le téléphone, le système détecte le changement de taille de fenêtre et lance le cycle standard de recréation de l'Activity. Screen Continuity intercepte ce processus et sauvegarde les données clés.

La méthode principale pour sauvegarder l'état est onRetainNonConfigurationInstance, qui est appelée avant la destruction de l'Activity. Le développeur y sauvegarde le modèle de données, la position de la liste et l'écran de navigation actuel. Après la recréation, l'Activity reçoit ces données via getLastNonConfigurationInstance et restaure l'interface exactement comme avant le pliage.

Pour les Fragments, le mécanisme est implémenté via setRetainInstance(true), qui empêche la destruction du fragment lors des changements de configuration. Dans Jetpack Compose, on utilise rememberSaveable, qui sauvegarde automatiquement l'état lors du changement des Window Metrics.

kotlin
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 }
    }
}

API ScreenContinuity dans Jetpack WindowManager

Jetpack WindowManager version 1.1+ inclut la classe ScreenContinuityController, qui fournit des mécanismes prêts à gérer la continuité d'écran. L'API gère automatiquement les changements de posture et notifie l'application via des interfaces callback.

ScreenContinuityController

La classe centrale qui enregistre les écouteurs de changement de posture. registerContinuityListener accepte un callback qui se déclenche à chaque transition entre les états de l'appareil pliable. Le contrôleur fournit également des informations sur la posture actuelle via la méthode getCurrentFoldingFeature.

FoldingFeatureAdapter

Une classe utilitaire pour transformer les données FoldingFeature en états lisibles par l'application. FoldingFeatureAdapter normalise les coordonnées de la charnière et détermine si la posture actuelle est HALF_OPENED, FLAT ou TABLE_TOP. Cela évite au développeur de calculer manuellement les angles et les seuils.

Intégration avec Jetpack Compose

Pour les applications Compose, WindowManager fournit WindowSizeClass et des modificateurs qui tiennent compte du pli. Le composant BoxWithConstraints s'adapte aux changements de taille d'écran en temps réel sans recréation de l'Activity. Compose déclenche automatiquement la recomposition lorsque les WindowMetrics changent.

kotlin
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController

controller.registerContinuityListener { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
        FoldingFeature.State.FLAT -> expandToTablet()
    }
}

Exemple d'implémentation en Kotlin

Examinons un exemple complet d'Activity avec le support de Screen Continuity. MainActivity gère trois scénarios : pliage, dépliage et état semi-plié. Les données sont sauvegardées via onRetainNonConfigurationInstance et restaurées lors de la recréation.

kotlin
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'élément clé est la classe ContinuityState, qui stocke la liste des éléments et la position de défilement. L'Activity la sauvegarde avant la recréation et la restaure immédiatement après l'appel à onCreate. Le contrôleur WindowManager s'abonne aux changements de posture et bascule la disposition entre les modes.

Test de la continuité sur émulateur et appareil

Android Studio fournit un émulateur d'appareil pliable avec le support des trois postures. Pour tester Screen Continuity, créez simplement un appareil virtuel de type Pixel Fold ou Samsung Galaxy Z Fold et basculez les postures via le panneau de contrôle de l'émulateur.

Configuration de l'émulateur

Créez un AVD avec la catégorie Foldable et sélectionnez une résolution d'écran de 7,6 pouces. Dans les contrôles étendus de l'émulateur, ouvrez l'onglet Folding Postures et basculez entre les postures. Chaque basculement déclenche un configuration change que l'application doit gérer correctement.

Appareil physique

Sur un appareil réel (Galaxy Z Fold 5, Pixel Fold), les tests sont effectués en pliant et dépliant physiquement. Les modes Samsung DeX et Multi-Window activent également la continuité. Pour le débogage, utilisez la commande ADB adb shell dumpsys window policy, qui affiche l'état actuel du pli.

Problèmes courants

Les principales erreurs incluent la perte d'état du RecyclerView, la réinitialisation du contenu des champs de texte et la fermeture des fenêtres de dialogue. ViewModel résout ces problèmes en conservant les données en mémoire indépendamment du cycle de vie de l'Activity. Il est également important d'annoter l'Activity dans le manifeste avec le paramètre android:configChanges si l'application gère les changements manuellement.

xml
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

Foire aux questions

En quoi Screen Continuity diffère-t-il de la sauvegarde d'état classique ?

Screen Continuity sauvegarde l'état lors des changements physiques de taille d'écran, pas seulement lors de la rotation. Le onSaveInstanceState classique ne garantit pas la préservation de l'état lors du changement de posture d'un appareil pliable, tandis que ScreenContinuityController gère ce scénario spécifique.

Quels appareils Android prennent en charge Screen Continuity ?

Tous les appareils pliables avec Android 10+ et Google Play Services. La prise en charge est incluse dans Pixel Fold, la série Galaxy Z Fold, Huawei Mate X, Oppo Find N et OnePlus Open. Nécessite Jetpack WindowManager version 1.1 ou supérieure.

Comment Screen Continuity fonctionne-t-il avec Jetpack Compose ?

Jetpack Compose prend en charge Screen Continuity via rememberSaveable et WindowSizeClass. La composition répond automatiquement aux changements de WindowMetrics, et rememberSaveable préserve l'état entre les recompositions. Le modificateur onSizeChanged permet de suivre les changements de taille en temps réel.

Que se passe-t-il si Screen Continuity n'est pas implémenté ?

Lors du dépliage ou du pliage de l'appareil, l'Activity est recréée sans sauvegarde de l'état. L'utilisateur perd les données saisies, le défilement est réinitialisé et les dialogues ouverts se ferment. Cela entraîne des avis négatifs et une baisse de la note de l'application sur Google Play.

Comment tester Screen Continuity sans appareil physique ?

Android Emulator prend en charge la simulation d'appareils pliables. Créez un AVD de type Pixel Fold, ouvrez Extended Controls et sélectionnez l'onglet Folding Postures. Le changement de posture déclenche un configuration change, permettant de tester la préservation de l'état sans appareil physique.

Résumé

  • Screen Continuity — un mécanisme Android pour préserver l'état de l'Activity lors du changement de configuration physique d'un appareil pliable.
  • Jetpack WindowManager fournit ScreenContinuityController pour suivre les postures HALF_OPENED, FLAT et TABLE_TOP.
  • onRetainNonConfigurationInstance — la méthode principale pour préserver les données avant la recréation de l'Activity lors du dépliage.
  • ViewModel et rememberSaveable dans Compose résolvent la perte d'état sans gestion manuelle du cycle de vie.
  • Émulateur Android Studio permet de tester toutes les postures d'appareil pliable sans appareil physique.
  • Ignorer Screen Continuity entraîne une réinitialisation de l'interface utilisateur et une perte des données saisies lors du pliage.
  • Il est recommandé d'ajouter le support de la continuité à toutes les applications destinées aux appareils pliables et aux tablettes.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi