Los widgets son vistas de apps en miniatura que puedes incorporar en otras apps, como la pantalla principal, y recibir actualizaciones periódicas. Estas vistas se denominan widgets en la interfaz de usuario, y puedes publicar una con un proveedor de widgets de apps (o proveedor de widgets). Un componente de la app que contiene otros widgets se denomina host de widgets de la app (o host de widgets). En la figura 1, se muestra un ejemplo de widget de música:
En este documento, se describe cómo publicar un widget con un proveedor de widgets. Para obtener detalles sobre cómo crear tu propio AppWidgetHost para alojar widgets de apps, consulta Cómo compilar un host de widgets.
Para obtener información sobre cómo diseñar tu widget, consulta Descripción general de los widgets de apps.
Componentes de widgets
Para crear un widget, necesitas los siguientes componentes básicos:
- Objeto
AppWidgetProviderInfo - Describe los metadatos de un widget, como el diseño, la frecuencia de actualización y la clase
AppWidgetProvider.AppWidgetProviderInfose define en XML, como se describe en este documento. - Clase
AppWidgetProvider - Define los métodos básicos que te permiten interactuar de manera programática con el widget. De esta manera, recibirás emisiones cuando se actualice, se habilite, se inhabilite o se borre el widget. Declara
AppWidgetProvideren el manifiesto y, luego, implementa el servicio, como se describe en este documento. - Diseño de la vista
- Define el diseño inicial del widget. El diseño se define en XML, como se describe en este documento.
En la figura 2, se muestra cómo estos componentes se ajustan al flujo general de procesamiento de widgets de la app.
Si tu widget necesita configuración del usuario, implementa la actividad de configuración del widget de la app. Esta actividad permite a los usuarios modificar la configuración de los widgets, por ejemplo, la zona horaria de un widget de reloj.
- A partir de Android 12 (nivel de API 31), puedes proporcionar una configuración predeterminada y permitir que los usuarios reconfiguren el widget más adelante. Consulta Cómo usar la configuración predeterminada del widget y Cómo permitir que los usuarios reconfiguren los widgets colocados para obtener más detalles.
- En Android 11 (nivel de API 30) o versiones anteriores, esta actividad se inicia cada vez que el usuario agrega el widget a su pantalla principal.
También recomendamos las siguientes mejoras: diseños de widgets flexibles, mejoras varias, widgets avanzados, widgets de colección y cómo compilar un host de widgets.
Declara el XML de AppWidgetProviderInfo
La definición de la configuración de metadatos (como los tamaños de celda predeterminados, las restricciones de cambio de tamaño y las frecuencias de actualización) es exactamente igual en las vistas tradicionales y en los widgets basados en Glance.
Para obtener información sobre cómo definir y configurar tu archivo en formato XML de metadatos, consulta la sección Declarar el archivo XML de AppWidgetProviderInfo de la documentación de Glance.
Usa la clase AppWidgetProvider para controlar las transmisiones de widgets
Los mecanismos del receptor de transmisiones, los filtros de declaración del manifiesto y los bucles de eventos de ciclo de vida de la plataforma están unificados en la plataforma. En el desarrollo de Compose primero, estas transmisiones se organizan con el wrapper GlanceAppWidgetReceiver.
Para comprender cómo registrar tu receptor en el manifiesto y cómo implementar anulaciones del ciclo de vida compatibles con Hilt, consulta la sección Usa la clase AppWidgetProvider para controlar emisiones en la documentación de Glance.
Crea el diseño del widget
Debes definir un diseño inicial para el widget en formato XML y guardarlo en el directorio res/layout/ del proyecto. Consulta los Lineamientos de diseño para obtener más detalles.
Crear el diseño del widget es sencillo si tienes conocimientos sobre los diseños. Sin embargo, ten en cuenta que los diseños de los widgets se basan en RemoteViews, que no admite todo tipo de diseño o widget de vista.
No puedes usar vistas personalizadas ni subclases de las vistas que admite RemoteViews.
RemoteViews también admite ViewStub, que es un View invisible de tamaño cero que puedes usar para aumentar de forma diferida los recursos de diseño durante el tiempo de ejecución.
Compatibilidad para comportamientos con estado
Android 12 agrega compatibilidad para comportamientos con estados a través de los siguientes componentes existentes:
El widget todavía no tiene un estado. La app debe almacenar el estado y registrarse para los eventos de cambio de estado.
En el siguiente ejemplo de código, se muestra cómo implementar estos componentes.
Kotlin
// 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)
)
Java
// 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));
Proporciona dos diseños: uno que se oriente a dispositivos que ejecutan Android 12 o versiones posteriores en res/layout-v31, y el otro que se oriente a versiones anteriores de Android 11 o versiones anteriores en la carpeta res/layout predeterminada.
Cómo implementar esquinas redondeadas
El cálculo de los radios externos y proporcionales internos es estándar y compartido. En el desarrollo que prioriza Compose, esto se puede configurar de forma dinámica en Kotlin junto con los recursos de temas personalizados.
Para implementar radios de esquinas o configurar estilos dinámicos para dispositivos Android más antiguos, consulta la sección Implementar esquinas redondeadas centrada en Compose en la documentación de Glance.