Zurück zur Startseite

DreamService und Compose in Android 4.2+

DreamService ermöglicht die Erstellung von UI im Android-Schlafmodus während des Ladens. Die Integration von Jetpack Compose erfordert die Implementierung von LifecycleOwner und SavedStateRegistryOwner. Schritt-für-Schritt-Anleitung mit Code für Middle-/Senior-Entwickler.

Compose in DreamService: UI für Android im Schlafmodus
Advertisement 728x90

DreamService in Android: Jetpack Compose für Dream-Screens integrieren

DreamService, eingeführt in Android 4.2, ermöglicht die Anzeige benutzerdefinierter UIs auf dem Gerät im Leerlauf während des Ladevorgangs. Die Komponente erbt von Service und unterstützt interaktive Elemente, einschließlich Schaltflächen. Die Aktivierung erfordert eine manuelle Konfiguration durch den Nutzer in den Anzeigeeinstellungen. Diese Lösung eignet sich für die Erstellung dynamischer Bildschirme, ohne den Lebenszyklus der Haupt-App zu beeinflussen.

Die Deklaration des Services in der AndroidManifest.xml ist 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>

Die Basisimplementierung verwendet onAttachedToWindow(), um die View zu konfigurieren:

Google AdInline article slot
class MyDreamService : DreamService() {

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()

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

Jetpack Compose in DreamService integrieren

Die setContentView-Methode funktioniert nur mit Views, daher wird für Compose eine ComposeView erstellt. DreamService stellt jedoch weder ViewTreeLifecycleOwner noch SavedStateRegistryOwner bereit, was für die korrekte Funktion von Compose entscheidend ist.

Die Lösung besteht darin, DreamService um eine Implementierung von SavedStateRegistryOwner zu erweitern:

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
}

Synchronisieren Sie in onAttachedToWindow() den Lebenszyklus und die Registry:

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

setContentView(composeView)

Vergessen Sie nicht, lifecycle-Methoden in den DreamService-Callbacks (onAttachedToWindow, onDetachedFromWindow usw.) aufzurufen, um den Zustand korrekt zu synchronisieren.

Wichtige Einschränkungen und Best Practices

  • Aktivierung: Nutzer müssen Daydream in den Einstellungen manuell aktivieren. Ein automatischer Start ist nicht möglich.
  • Lebenszyklus: Stellen Sie die vollständige Implementierung von LifecycleOwner für Compose sicher, sonst wird die UI nicht aktualisiert.
  • Performance: Vermeiden Sie schwere Animationen — das Gerät befindet sich im Schlafmodus.
  • Interaktivität: isInteractive = true ermöglicht Schaltflächen, erfordert jedoch Vorsicht hinsichtlich des Stromverbrauchs.

Liste der Implementierungsschritte:

  • Deklarieren Sie den Service im Manifest mit der BIND_DREAM_SERVICE-Berechtigung.
  • Erben Sie von DreamService und fügen Sie SavedStateRegistryOwner hinzu.
  • Initialisieren Sie LifecycleRegistry und SavedStateRegistryController.
  • Legen Sie in ComposeView die Owner vor setContent fest.
  • Testen Sie auf einem echten Gerät im Lademodus.

Fazit

  • DreamService ist neben Activity ein vollwertiger UI-Host, der Compose nach Anpassungen des Lebenszyklus unterstützt.
  • Die manuelle Aktivierung in den Anzeigeeinstellungen ist obligatorisch.
  • Lösen Sie ViewTreeLifecycleOwner-Probleme durch Erweiterung des Services.
  • Geeignet für Idle-Screens: Uhren, Benachrichtigungen, Minispiele.
  • Energieeinsparung ist kritisch — Minimieren Sie Draw-Calls.

Diese Funktion erweitert die Möglichkeiten der Android-Entwicklung und ermöglicht die Anpassung des Geräteverhaltens in ungewöhnlichen Szenarien. Für Senior-Developer ist sie im Kontext eines tiefen Verständnisses von Plattform-Services und deren Integration mit modernen UI-Frameworks nützlich.

Google AdInline article slot

— Editorial Team

Advertisement 728x90

Weiterlesen