GlanceAppWidget verwalten und aktualisieren

In den folgenden Abschnitten wird beschrieben, wie Sie GlanceAppWidget aktualisieren und den Status verwalten.

Status „GlanceAppWidget“ verwalten

Die angegebene Klasse GlanceAppWidget wird immer dann instanziiert, wenn das Widget erstellt wird oder aktualisiert werden muss. Daher sollte es zustandslos und passiv sein.

Das Konzept des Staates lässt sich wie folgt unterteilen:

  • Anwendungsstatus: Der Status oder der Inhalt der Anwendung, der für das Widget benötigt wird. Beispiel: eine Liste mit gespeicherten Zielen (d.h. einer Datenbank), die vom Nutzer definiert wurde.
  • Glance State: Der spezifische Status, der nur für das App-Widget relevant ist und den Status der App nicht unbedingt ändert oder beeinflusst. Beispielsweise wurde ein Kästchen im Widget ausgewählt oder ein Zähler wurde erhöht.

Anwendungsstatus verwenden

App-Widgets sollten passiv sein. Jede Anwendung ist für die Verwaltung der Datenschicht und die Verarbeitung der Status wie Inaktivität, Laden und Fehler verantwortlich, die auf der Widget-UI angezeigt werden.

Mit dem folgenden Code werden beispielsweise die Ziele aus dem speicherinternen Cache aus der Repository-Ebene abgerufen, die gespeicherte Liste der Ziele bereitgestellt und je nach Status eine andere UI angezeigt:

class DestinationAppWidget : GlanceAppWidget() {

    // ...

    @Composable
    fun MyContent() {
        val repository = remember { DestinationsRepository.getInstance() }
        // Retrieve the cache data everytime the content is refreshed
        val destinations by repository.destinations.collectAsState(State.Loading)

        when (destinations) {
            is State.Loading -> {
                // show loading content
            }

            is State.Error -> {
                // show widget error content
            }

            is State.Completed -> {
                // show the list of destinations
            }
        }
    }
}

Bei jeder Änderung des Status oder der Daten ist die App dafür verantwortlich, das Widget zu benachrichtigen und zu aktualisieren. Weitere Informationen findest du unter GlanceAppWidget aktualisieren.

GlanceAppWidget aktualisieren

Wie im Abschnitt GlanceAppWidget-Status verwalten erläutert, werden App-Widgets in einem anderen Prozess gehostet. Glance übersetzt den Inhalt in die tatsächliche RemoteViews und sendet sie an den Host. Um den Inhalt zu aktualisieren, muss Glance die RemoteViews neu erstellen und noch einmal senden.

Rufen Sie zum Senden der Aktualisierung die Methode update der Instanz GlanceAppWidget auf und geben Sie die context und das glanceId an:

MyAppWidget().update(context, glanceId)

Um glanceId zu erhalten, fragen Sie GlanceAppWidgetManager ab:

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

Alternativ können Sie eine der GlanceAppWidget update-Erweiterungen verwenden:

// Updates all placed instances of MyAppWidget
MyAppWidget().updateAll(context)

// Iterate over all placed instances of MyAppWidget and update if the state of
// the instance matches the given predicate
MyAppWidget().updateIf<State>(context) { state ->
    state == State.Completed
}

Diese Methoden können von jedem Teil Ihrer Anwendung aus aufgerufen werden. Da es sich um suspend-Funktionen handelt, empfehlen wir, sie außerhalb des Hauptthreadbereichs zu starten. Im folgenden Beispiel werden sie in einem CoroutineWorker gestartet:

class DataSyncWorker(
    val context: Context,
    val params: WorkerParameters,
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        // Fetch data or do some work and then update all instance of your widget
        MyAppWidget().updateAll(context)
        return Result.success()
    }
}

Weitere Informationen finden Sie unter Kotlin-Koroutinen unter Android.