Zarządzanie aplikacją GlanceAppWidget i ich aktualizowanie

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 contextglanceId:

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