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 :
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 :
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
LifecycleOwnerpour Compose, sinon l'interface ne se mettra pas à jour. - Performance : Évitez les animations lourdes — l'appareil est en mode veille.
- Interactivité :
isInteractive = trueautorise 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
DreamServiceet ajoutezSavedStateRegistryOwner. - Initialisez
LifecycleRegistryetSavedStateRegistryController. - Dans
ComposeView, définissez les propriétaires avantsetContent. - 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
ViewTreeLifecycleOwneren é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.
— Editorial Team
Aucun commentaire pour le moment.