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.