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

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

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

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

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

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

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

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

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

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 минут.
  • Обновите виджет в ответ на трансляцию.

Ресурсы