Виджеты приложений – это миниатюрные представления для приложений, которые можно встраивать в другие приложения, например в главный экран, и периодически обновлять. В пользовательском интерфейсе эти представления называются виджетами. Вы можете опубликовать виджет с помощью поставщика виджетов приложений (или поставщика виджетов). Компонент приложения, который содержит другие виджеты, называется хостом виджетов приложения (или хостом виджетов). На рисунке 1 показан пример музыкального виджета.
В этом документе описывается, как опубликовать виджет с помощью поставщика виджетов. Подробнее о том, как создать собственный класс AppWidgetHost для размещения виджетов приложений, рассказывается в статье Как создать хост виджетов.
Подробнее о том, как разработать виджет…
Компоненты виджета
Чтобы создать виджет, вам понадобятся следующие основные компоненты:
- Объект
AppWidgetProviderInfo - Описывает метаданные виджета, такие как его макет, частота обновлений и класс
AppWidgetProvider.AppWidgetProviderInfoопределяется в XML, как описано в этом документе. - Класс
AppWidgetProvider - Определяет основные методы, которые позволяют программно взаимодействовать с виджетом. Через него вы получаете трансляции, когда виджет обновляется, включается, отключается или удаляется. Вы объявляете
AppWidgetProviderв манифесте, а затем реализуете его, как описано в этом документе. - Посмотреть шаблон экрана
- Определяет начальный макет виджета. Макет определяется в XML-файле, как описано в этом документе.
На рисунке 2 показано, как эти компоненты вписываются в общий процесс обработки виджетов приложений.
Если виджету требуется пользовательская настройка, реализуйте действие по настройке виджета приложения. Это действие позволяет пользователям изменять настройки виджета, например часовой пояс для виджета часов.
- Начиная с Android 12 (уровень API 31) вы можете задать конфигурацию по умолчанию и разрешить пользователям изменять ее. Подробнее о том, как использовать конфигурацию виджета по умолчанию и как разрешить пользователям изменять конфигурацию размещенных виджетов…
- В Android 11 (уровень API 30) или более ранней версии это действие запускается каждый раз, когда пользователь добавляет виджет на главный экран.
Мы также рекомендуем следующие улучшения: гибкие макеты виджетов, различные улучшения, расширенные виджеты, виджеты коллекций и создание хоста виджетов.
Объявление XML-файла AppWidgetProviderInfo
Определение настроек метаданных (таких как размеры ячеек по умолчанию, ограничения на изменение размера и частота обновления) абсолютно одинаково как для традиционных представлений, так и для виджетов на основе Glance.
Чтобы узнать, как определить и настроить XML-файл метаданных, ознакомьтесь с разделом Объявление XML-раздела AppWidgetProviderInfo в документации по Glance.
Используйте класс AppWidgetProvider для обработки широковещательных рассылок виджетов.
Механизмы широковещательного приемника, фильтры объявления манифеста и циклы событий жизненного цикла объединены в платформе. При разработке с приоритетом Compose эти трансляции координируются с помощью оболочки GlanceAppWidgetReceiver.
Чтобы узнать, как зарегистрировать приемник в манифесте и реализовать переопределения жизненного цикла, совместимые с Hilt, ознакомьтесь с разделом Использование класса AppWidgetProvider для обработки широковещательных сообщений в документации по Glance.
Создайте макет виджета
Вы должны определить начальный макет виджета в XML и сохранить его в каталоге res/layout/ проекта. Подробную информацию можно найти в рекомендациях по дизайну.
Если вы знакомы с макетами, то создать макет виджета будет несложно. Однако макеты виджетов основаны на RemoteViews, который поддерживает не все виды макетов и виджетов.
Вы не можете использовать специальные представления или подклассы представлений, поддерживаемых RemoteViews.
RemoteViews также поддерживает ViewStub – невидимый View нулевого размера, который можно использовать для отложенного заполнения ресурсов макета во время выполнения.
Поддержка поведения с сохранением состояния
В Android 12 добавлена поддержка сохранения состояния с помощью следующих существующих компонентов:
Виджет по-прежнему не имеет состояния. Приложение должно сохранять состояние и регистрироваться для событий изменения состояния.
В примере кода ниже показано, как реализовать эти компоненты.
// Check the view. remoteView.setCompoundButtonChecked(R.id.my_checkbox, true) // Check a radio group. remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2) // Listen for check changes. The intent has an extra with the key // EXTRA_CHECKED that specifies the current checked state of the view. remoteView.setOnCheckedChangeResponse( R.id.my_checkbox, RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent) )
Предоставьте два макета: один для устройств с Android 12 или более поздней версией в папке res/layout-v31, а другой – для устройств с Android 11 или более ранней версией в папке res/layout по умолчанию.
Как реализовать скругленные углы
Расчет внешнего фона и внутренних пропорциональных радиусов является стандартным и общим. При разработке на основе Compose это можно задать динамически в Kotlin вместе с ресурсами пользовательской темы.
Чтобы настроить радиус скругления углов или динамические стили для более старых устройств Android, ознакомьтесь с разделом Реализация скругленных углов в документации по Glance.