Виджеты приложений – это миниатюрные представления приложений, которые можно встраивать в другие приложения, например на главный экран, и получать периодические обновления. В интерфейсе такие представления называются виджетами. Чтобы опубликовать виджет, вам понадобится поставщик виджетов приложений (или просто поставщик виджетов). Компонент приложения, в котором размещаются другие виджеты, называется хостом виджетов (или хостом). На рисунке 1 показан пример музыкального виджета:
В этой статье рассказывается, как опубликовать виджет с помощью поставщика виджетов. Подробнее о том, как создать собственный AppWidgetHost для размещения виджетов приложений, можно узнать в статье Как создать хост виджетов.
Подробнее о том, как создавать виджеты приложений…
Компоненты виджета
Чтобы создать виджет, вам понадобятся следующие основные компоненты:
- Объект
AppWidgetProviderInfo - Описывает метаданные виджета, например его макет, частоту обновления и класс
AppWidgetProvider.AppWidgetProviderInfoопределяется в XML, как описано в этом документе. AppWidgetProviderкурс- Определяет основные методы, которые позволяют программно взаимодействовать с виджетом. С его помощью вы получаете широковещательные сообщения, когда виджет обновляется, включается, отключается или удаляется. Вы объявляете
AppWidgetProviderв манифесте, а затем реализуете его, как описано в этом документе. - Посмотреть шаблон экрана
- Определяет начальный макет виджета. Макет определяется в XML, как описано в этом документе.
На рисунке 2 показано, как эти компоненты вписываются в общий процесс обработки виджетов приложений.
Если виджету требуется настройка, реализуйте активность конфигурации виджета приложения. Это действие позволяет пользователям изменять настройки виджетов, например часовой пояс для виджета часов.
- В Android 12 (уровень API 31) и более поздних версиях можно задать конфигурацию по умолчанию, а затем разрешить пользователям изменять ее. Подробнее о том, как использовать конфигурацию виджета по умолчанию и как разрешить пользователям изменять конфигурацию размещенных виджетов…
- В Android 11 (уровень API 30) и более ранних версиях это действие запускается каждый раз, когда пользователь добавляет виджет на главный экран.
Мы также рекомендуем следующие улучшения: гибкие макеты виджетов, разные улучшения, расширенные виджеты, виджеты коллекций и создание хоста виджетов.
Как объявить XML-файл AppWidgetProviderInfo
Настройки метаданных (например, размеры ячеек по умолчанию, ограничения на изменение размера и частота обновления) задаются одинаково как для традиционных представлений, так и для виджетов на основе Glance.
Информацию о том, как определить и настроить XML-файл метаданных, можно найти в разделе Declare the AppWidgetProviderInfo 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.