Управление и обновление GlanceAppWidget

В следующих разделах описано, как обновлять GlanceAppWidget и управлять его состоянием.

Управление состоянием GlanceAppWidget

Предоставленный класс GlanceAppWidget создается каждый раз, когда виджет создается или требует обновления, поэтому он должен быть без состояния и пассивным .

Понятие государства можно разделить на следующие категории:

  • Состояние приложения : состояние или содержимое приложения, необходимое виджету. Например, список сохраненных мест назначения (например, базы данных), определенный пользователем.
  • Состояние «Краткий обзор» : конкретное состояние, относящееся только к виджету приложения и не обязательно изменяющее или влияющее на состояние самого приложения. Например, в виджете был выбран флажок или увеличился счетчик.

Использовать состояние приложения

Виджеты приложений должны быть пассивными. Каждое приложение отвечает за управление уровнем данных и обработку состояний, таких как бездействие, загрузка и ошибка, отображаемых в пользовательском интерфейсе виджета.

Например, следующий код извлекает адреса назначения из кэша в оперативной памяти на уровне репозитория, предоставляет сохраненный список адресов назначения и отображает различный пользовательский интерфейс в зависимости от их состояния:

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
            }
        }
    }
}

При каждом изменении состояния или данных приложение обязано уведомить и обновить виджет. Дополнительную информацию см. в разделе «Обновление GlanceAppWidget» .

Обновить виджет GlanceAppWidget

Вы можете запросить обновление содержимого виджета с помощью GlanceAppWidget . Как объяснено в разделе «Управление состоянием GlanceAppWidget , виджеты приложения размещаются в другом процессе. Glance преобразует содержимое в фактические RemoteViews и отправляет их на хост. Для обновления содержимого Glance должен заново создать RemoteViews и отправить их снова.

Для отправки обновления вызовите метод update экземпляра ` GlanceAppWidget , указав context и ` glanceId :

MyAppWidget().update(context, glanceId)

Чтобы получить glanceId , выполните запрос к GlanceAppWidgetManager :

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

В качестве альтернативы можно использовать одно из расширений 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
}

Эти методы можно вызывать из любой части вашего приложения. Поскольку это функции suspend , мы рекомендуем запускать их вне области видимости основного потока. В следующем примере они запускаются в 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()
    }
}

Более подробную информацию о сопрограммах см. в разделе «Kotlin Coroutines на Android» .

Когда обновлять виджеты?

Обновляйте виджеты либо немедленно, либо периодически.

Ваш виджет может обновляться мгновенно, как только приложение активируется. Например:

  • Когда пользователь взаимодействует с виджетом, это запускает действие, вызов лямбда-функции или интент для запуска активности.
  • Когда пользователь взаимодействует с вашим приложением в фоновом режиме или во время обновления приложения в ответ на сообщение Firebase Cloud Messaging (FCM) или широковещательную рассылку.

В таких случаях вызовите метод update , как описано в данном руководстве.

Ваш виджет может периодически обновляться, когда приложение неактивно. Например:

  • Используйте updatePeriodMillis для обновления виджета с периодичностью до 30 минут.
  • Используйте WorkManager для планирования более частых обновлений, например, каждые 15 минут.
  • Обновляйте виджет в ответ на широковещательное сообщение.

Ресурсы