Retour à l'accueil

DreamService et Compose dans Android 4.2+

DreamService permet de créer une UI en mode veille Android pendant la charge. L'intégration de Jetpack Compose nécessite l'implémentation de LifecycleOwner et SavedStateRegistryOwner. Guide étape par étape avec code pour développeurs intermédiaires/seniors.

Compose dans DreamService : UI pour Android en veille
Advertisement 728x90

DreamService sous Android : Intégrer Jetpack Compose pour les écrans de veille

DreamService, introduit dans Android 4.2, permet d'afficher une interface utilisateur personnalisée sur l'appareil lorsqu'il est inactif pendant la charge. Le composant hérite de Service et prend en charge les éléments interactifs, y compris les boutons. L'activation nécessite une configuration manuelle par l'utilisateur dans les paramètres d'affichage. Cette solution convient pour créer des écrans dynamiques sans affecter le cycle de vie principal de l'application.

Déclarer le service dans AndroidManifest.xml est standard :

<service
    android:name=".MyDreamService"
    android:exported="true"
    android:description="@string/dream_service_description"
    android:icon="@drawable/dream_service_icon"
    android:label="@string/dream_service_label"
    android:permission="android.permission.BIND_DREAM_SERVICE">

    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

L'implémentation de base utilise onAttachedToWindow() pour configurer la vue :

Google AdInline article slot
class MyDreamService : DreamService() {

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()

        isInteractive = false
        isFullscreen = true
        setContentView(R.layout.dream_service_layout)
    }
}

Intégrer Jetpack Compose dans DreamService

La méthode setContentView fonctionne uniquement avec des Views, donc un ComposeView est créé pour Compose. Cependant, DreamService ne fournit pas ViewTreeLifecycleOwner et SavedStateRegistryOwner, qui sont critiques pour le fonctionnement correct de Compose.

La solution consiste à étendre DreamService avec une implémentation de SavedStateRegistryOwner :

class MyDreamService : DreamService(), SavedStateRegistryOwner {

    private val lifecycleRegistry = LifecycleRegistry(this)
    private val savedStateRegistryController = SavedStateRegistryController.create(this)

    override val lifecycle: Lifecycle
        get() = lifecycleRegistry

    override val savedStateRegistry: SavedStateRegistry
        get() = savedStateRegistryController.savedStateRegistry
}

Dans onAttachedToWindow(), synchronisez le cycle de vie et le registre :

Google AdInline article slot
val composeView = ComposeView(this).apply {
    setViewTreeLifecycleOwner(this@MyDreamService)
    setViewTreeSavedStateRegistryOwner(this@MyDreamService)
    setContent {
        DreamServiceTheme {
            DreamScreen(
                onOpenSettings = { 
                    openSettingsAndExitDream() 
                }
            )
        }
    }
}

setContentView(composeView)

N'oubliez pas d'appeler les méthodes lifecycle dans les rappels DreamService (onAttachedToWindow, onDetachedFromWindow, etc.) pour une synchronisation d'état appropriée.

Limitations clés et bonnes pratiques

  • Activation : Les utilisateurs doivent activer manuellement Daydream dans les paramètres. Le lancement automatique est impossible.
  • Cycle de vie : Assurez une implémentation complète de LifecycleOwner pour Compose, sinon l'interface ne se mettra pas à jour.
  • Performance : Évitez les animations lourdes — l'appareil est en mode veille.
  • Interactivité : isInteractive = true autorise les boutons, mais nécessite de la prudence concernant la consommation d'énergie.

Liste des étapes d'implémentation :

  • Déclarez le service dans le manifeste avec la permission BIND_DREAM_SERVICE.
  • Héritez de DreamService et ajoutez SavedStateRegistryOwner.
  • Initialisez LifecycleRegistry et SavedStateRegistryController.
  • Dans ComposeView, définissez les propriétaires avant setContent.
  • Testez sur un appareil réel en mode charge.

Points clés à retenir

  • DreamService est un hôte UI à part entière en plus d'Activity, prenant en charge Compose après ajustements du cycle de vie.
  • L'activation manuelle dans les paramètres d'affichage est obligatoire.
  • Résolvez les problèmes ViewTreeLifecycleOwner en étendant le service.
  • Convient pour les écrans inactifs : horloges, notifications, mini-jeux.
  • L'économie d'énergie est critique — minimisez les appels de dessin.

Cette fonctionnalité étend les capacités de développement Android, permettant la personnalisation du comportement de l'appareil dans des scénarios non standards. Pour les développeurs seniors, c'est utile dans le contexte d'une compréhension approfondie des services de plateforme et de leur intégration avec les frameworks UI modernes.

Google AdInline article slot

— Editorial Team

Advertisement 728x90

Lire ensuite