В следующих разделах описано, как обновлять 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 минут. - Обновляйте виджет в ответ на широковещательное сообщение.
Ресурсы
- Создайте виджет с помощью Glance (Codelab)
- Создание будущего Android: глава о виджетах (видео)