GlanceAppWidget verwalten und aktualisieren

In den folgenden Abschnitten wird beschrieben, wie Sie GlanceAppWidget aktualisieren und die Bundesstaat.

GlanceAppWidget-Status verwalten

Die angegebene GlanceAppWidget-Klasse wird immer dann instanziiert, wenn das Widget erstellt oder erfordert ein Update, daher sollte es zustandslos und passiv sein.

Das Konzept eines Zustands lässt sich folgendermaßen unterteilen:

  • Anwendungsstatus: Der Status oder Inhalt der App, der für die Widget. Zum Beispiel eine Liste gespeicherter Ziele (d.h. Datenbank), die durch Nutzenden.
  • Blickstatus: der spezifische Status, der nur für das App-Widget relevant ist und hat nicht zwangsläufig Auswirkungen auf den App-Status. Beispiel: aktiviert oder ein Zähler erhöht wurde.

Anwendungsstatus verwenden

App-Widgets sollten passiv sein. Jede Anwendung ist für die Verwaltung des der Datenschicht und den Status wie „Inaktiv“, „Wird geladen“ und „Fehlerreflektieren“. auf der Widget-Benutzeroberfläche.

Mit dem folgenden Code werden beispielsweise die Ziele aus dem Cache aus der Repository-Ebene, stellt die gespeicherte Liste der Ziele zeigt je nach Status eine andere Benutzeroberfläche an:

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 muss die App entsprechend informiert werden. und aktualisieren Sie das Widget. Weitere Informationen finden Sie unter LookAppWidget aktualisieren.

GlanceAppWidget aktualisieren

Wie im Abschnitt GlanceAppWidget-Status verwalten erläutert, werden Widgets von einem anderen Prozess gehostet. Mit einem Blick verwandeln Sie die Inhalte tatsächlichen RemoteViews und sendet sie an den Host. Um die Inhalte zu aktualisieren, muss die RemoteViews neu erstellen und noch einmal senden.

Rufen Sie zum Senden des Updates die Methode update der Instanz GlanceAppWidget auf. durch Angabe von context und glanceId:

MyAppWidget().update(context, glanceId)

Um das glanceId zu erhalten, fragen Sie das 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. Weil sie suspend-Funktionen nicht verwenden, empfehlen wir, sie außerhalb des Hauptthreads zu starten. Umfang. 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 für Android.