In den folgenden Abschnitten wird beschrieben, wie Sie GlanceAppWidget
aktualisieren und den Status verwalten.
Status von GlanceAppWidget
verwalten
Die bereitgestellte GlanceAppWidget
-Klasse wird immer dann instanziiert, wenn das Widget erstellt wird oder ein Update erforderlich ist. Sie sollte daher zustandslos und passiv sein.
Das Konzept des Status kann in Folgendes unterteilt werden:
- Anwendungsstatus: Der Status oder Inhalt der App, der für das Widget erforderlich ist. Zum Beispiel eine vom Nutzer definierte Liste gespeicherter Ziele (d.h. Datenbank).
- Glance-Status: Der spezifische Status, der nur für das App-Widget relevant ist und den Status der App nicht unbedingt ändert oder beeinflusst. Beispiel: Im Widget wurde ein Kästchen angeklickt oder ein Zähler erhöht.
Anwendungsstatus verwenden
App-Widgets sollten passiv sein. Jede Anwendung ist für die Verwaltung der Datenschicht und die Verarbeitung der Status wie „Leerlauf“, „Wird geladen“ und „Fehler“ verantwortlich, die in der Widget-Benutzeroberfläche angezeigt werden.
Mit dem folgenden Code werden beispielsweise die Ziele aus dem In-Memory-Cache der Repository-Ebene abgerufen, die gespeicherte Liste der Ziele bereitgestellt und je nach Status eine andere Benutzeroberfläche 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 } } } }
Immer wenn sich der Status oder die Daten ändern, muss die App das Widget benachrichtigen und aktualisieren. Weitere Informationen finden Sie unter GlanceAppWidget aktualisieren.
GlanceAppWidget
aktualisieren
Sie können die Aktualisierung der Widget-Inhalte über GlanceAppWidget
beantragen. Wie im Abschnitt GlanceAppWidget
-Status verwalten beschrieben, werden App-Widgets in einem separaten Prozess gehostet. Glance übersetzt den Inhalt in tatsächliche RemoteViews
und sendet sie an den Host. Damit die Inhalte aktualisiert werden, muss Glance die RemoteViews
neu erstellen und noch einmal senden.
Rufen Sie zum Senden des Updates die Methode update
der GlanceAppWidget
-Instanz auf und geben Sie die context
und die glanceId
an:
MyAppWidget().update(context, glanceId)
So rufen Sie das glanceId
ab:GlanceAppWidgetManager
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 aufgerufen werden. Da es sich um suspend
-Funktionen handelt, empfehlen wir, sie außerhalb des Bereichs des Hauptthreads 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 zu Koroutinen finden Sie unter Kotlin-Koroutinen in Android.
Wann sollten Widgets aktualisiert werden?
Widgets können entweder sofort oder regelmäßig aktualisiert werden.
Ihr Widget kann sofort aktualisiert werden, wenn Ihre App aktiv ist. Beispiel:
- Wenn ein Nutzer mit einem Widget interagiert und dadurch eine Aktion, einen Lambda-Aufruf oder ein Intent zum Starten einer Aktivität ausgelöst wird.
- Wenn Ihr Nutzer im Vordergrund mit Ihrer App interagiert oder die App bereits als Reaktion auf eine Firebase Cloud Messaging-Nachricht (FCM) oder einen Broadcast aktualisiert wird.
Rufen Sie in diesen Fällen die Methode update
auf, wie in diesem Leitfaden beschrieben.
Ihr Widget kann regelmäßig aktualisiert werden, auch wenn Ihre App nicht aktiv ist. Beispiel:
- Verwenden Sie
updatePeriodMillis
, um das Widget bis zu einmal alle 30 Minuten zu aktualisieren. - Mit
WorkManager
können Sie häufigere Aktualisierungen planen, z. B. alle 15 Minuten. - Das Widget als Reaktion auf eine Übertragung aktualisieren