В следующих разделах описывается, как обновлять 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 в Android…
Когда обновлять виджеты
Обновляйте виджеты сразу или периодически.
Виджет может обновляться сразу, когда приложение активно. Пример:
- Когда пользователь взаимодействует с виджетом, запуская действие, вызов лямбда-функции или намерение запустить действие.
- Когда пользователь взаимодействует с приложением на переднем плане или когда приложение уже обновляется в ответ на сообщение Firebase Cloud Messaging (FCM) или трансляцию.
В таких случаях вызывайте метод update, как описано в этом руководстве.
Виджет может периодически обновляться, когда приложение неактивно. Пример:
- Используйте
updatePeriodMillis, чтобы обновлять виджет не чаще одного раза в 30 минут. - Используйте
WorkManager, чтобы запланировать более частое обновление, например каждые 15 минут. - Обновление виджета в ответ на широковещательное сообщение.
Ресурсы
- Создание виджета с помощью Glance (практическая работа)
- Разработка для будущего Android: виджеты (видео)