Как создать простой виджет

Как создать письмо
Jetpack Compose – это рекомендуемый набор инструментов для создания интерфейсов Android. Узнайте, как создавать виджеты с помощью API в стиле Compose.

Виджеты приложений – это миниатюрные представления приложений, которые можно встраивать в другие приложения, например на главный экран, и получать периодические обновления. В интерфейсе такие представления называются виджетами. Чтобы опубликовать виджет, вам понадобится поставщик виджетов приложений (или просто поставщик виджетов). Компонент приложения, в котором размещаются другие виджеты, называется хостом виджетов (или хостом). На рисунке 1 показан пример музыкального виджета:

Пример музыкального виджета
Рисунок 1. Пример музыкального виджета.

В этой статье рассказывается, как опубликовать виджет с помощью поставщика виджетов. Подробнее о том, как создать собственный AppWidgetHost для размещения виджетов приложений, можно узнать в статье Как создать хост виджетов.

Подробнее о том, как создавать виджеты приложений…

Компоненты виджета

Чтобы создать виджет, вам понадобятся следующие основные компоненты:

Объект AppWidgetProviderInfo
Описывает метаданные виджета, например его макет, частоту обновления и класс AppWidgetProvider. AppWidgetProviderInfo определяется в XML, как описано в этом документе.
AppWidgetProvider курс
Определяет основные методы, которые позволяют программно взаимодействовать с виджетом. С его помощью вы получаете широковещательные сообщения, когда виджет обновляется, включается, отключается или удаляется. Вы объявляете AppWidgetProvider в манифесте, а затем реализуете его, как описано в этом документе.
Посмотреть шаблон экрана
Определяет начальный макет виджета. Макет определяется в XML, как описано в этом документе.

На рисунке 2 показано, как эти компоненты вписываются в общий процесс обработки виджетов приложений.

Как обрабатываются виджеты приложений
Рисунок 2. Схема обработки виджета приложения.

Если виджету требуется настройка, реализуйте активность конфигурации виджета приложения. Это действие позволяет пользователям изменять настройки виджетов, например часовой пояс для виджета часов.

Мы также рекомендуем следующие улучшения: гибкие макеты виджетов, разные улучшения, расширенные виджеты, виджеты коллекций и создание хоста виджетов.

Как объявить 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 добавлена поддержка поведения с сохранением состояния с использованием следующих компонентов:

Виджет по-прежнему не имеет состояния. Приложение должно хранить состояние и регистрировать события изменения состояния.

Пример виджета списка покупок с сохранением состояния
Рисунок 3. Пример поведения с сохранением состояния

В примере кода ниже показано, как реализовать эти компоненты.

// 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.