W sekcjach poniżej znajdziesz informacje o tym, jak aktualizować GlanceAppWidget
i zarządzać jego stanem.
Zarządzanie stanem GlanceAppWidget
Podana klasa GlanceAppWidget
jest tworzona za każdym razem, gdy widżet jest tworzony lub wymaga aktualizacji, więc powinna być bezstanowa i pasywna.
Pojęcie stanu można podzielić na te kategorie:
- Stan aplikacji: stan lub zawartość aplikacji wymagane przez widżet. Na przykład lista zapisanych miejsc docelowych (czyli baza danych) zdefiniowana przez użytkownika.
- Stan podglądu: stan, który jest istotny tylko w przypadku widżetu aplikacji i nie musi modyfikować ani wpływać na stan aplikacji. Na przykład zaznaczono pole wyboru w widżecie lub zwiększono licznik.
Używanie stanu aplikacji
Widżety aplikacji powinny być pasywne. Każda aplikacja jest odpowiedzialna za zarządzanie warstwą danych i obsługę stanów, takich jak bezczynność, ładowanie i błąd, które są odzwierciedlane w interfejsie widżetu.
Na przykład poniższy kod pobiera miejsca docelowe z pamięci podręcznej w warstwie repozytorium, udostępnia zapisaną listę miejsc docelowych i wyświetla inny interfejs w zależności od stanu:
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 } } } }
Gdy stan lub dane ulegną zmianie, aplikacja musi powiadomić widżet i go zaktualizować. Więcej informacji znajdziesz w sekcji Aktualizowanie widżetu GlanceAppWidget.
Zaktualizuj: GlanceAppWidget
Możesz poprosić o zaktualizowanie treści widżetu za pomocą GlanceAppWidget
. Jak wyjaśniono w sekcji Zarządzanie stanem GlanceAppWidget
, widżety aplikacji są hostowane w innym procesie. Glance tłumaczy treści na RemoteViews
i wysyła je do hosta. Aby zaktualizować treść, Glance musi ponownie utworzyć RemoteViews
i wysłać je jeszcze raz.
Aby wysłać aktualizację, wywołaj metodę update
instancji GlanceAppWidget
, podając context
i glanceId
:
MyAppWidget().update(context, glanceId)
Aby uzyskać glanceId
, wyślij zapytanie do GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
Możesz też użyć jednego z tych rozszerzeń: GlanceAppWidget update
// 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 }
Te metody można wywoływać z dowolnej części aplikacji. Ponieważ są to funkcjesuspend
, zalecamy uruchamianie ich poza zakresem głównego wątku. W tym przykładzie są one uruchamiane w CoroutineWorker
:
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() } }
Więcej informacji o korutynach znajdziesz w artykule Korutyny Kotlin na Androidzie.
Kiedy aktualizować widżety
Aktualizuj widżety natychmiast lub okresowo.
Gdy aplikacja jest aktywna, widżet może się natychmiast zaktualizować. Na przykład:
- Gdy użytkownik wchodzi w interakcję z widżetem, co powoduje wywołanie działania, wywołanie funkcji lambda lub intencję uruchomienia aktywności.
- Gdy użytkownik wchodzi w interakcję z aplikacją działającą na pierwszym planie lub gdy aplikacja jest już aktualizowana w odpowiedzi na wiadomość z Komunikacji w chmurze Firebase (FCM) lub transmisję.
W takich przypadkach wywołaj metodę update
zgodnie z opisem w tym przewodniku.
Widżet może być okresowo aktualizowany, gdy aplikacja nie jest aktywna. Na przykład:
- Użyj
updatePeriodMillis
, aby aktualizować widżet maksymalnie raz na 30 minut. - Użyj
WorkManager
, aby zaplanować częstsze aktualizacje, np. co 15 minut. - Aktualizowanie widżetu w odpowiedzi na transmisję.
Materiały
- Tworzenie widżetu za pomocą Glance (ćwiczenia z programowania)
- Tworzenie przyszłości Androida: rozdział dotyczący widżetów (film)