Cómo codificar un sencillo widget Android
Widgets de aplicación pueden ser considerados como una pequeña ventana o controlador de una aplicación para Android que se puede incrustar en otra aplicación (como la pantalla de inicio). Ellos pueden ser muy útiles, lo que permite a los usuarios ver o controlar una aplicación sin tener que lanzarlo. Por ejemplo, saltar pistas con un widget de reproductor de música, o ver la información meteorológica. La gran cosa acerca de los widgets es que pueden ser actualizados de forma automática (después de un período de tiempo), o en respuesta a una acción del usuario.
En este desarrollador tutorial, vamos a crear un widget Android simple, que se actualiza automáticamente cada 30 minutos, o en respuesta a que el usuario pulsando el botón de actualización en el widget. Nuestro widget genera y muestra un número al azar en cada actualización (ya sea automática o debido a la interacción del usuario).
Para crear un widget requiere cuatro pasos:
- Diseñar la disposición de widgets. Por lo menos, tendrá un archivo de diseño que describe el diseño de widgets. Sin embargo, también puede proporcionar archivos de diseño adicionales para
- El widget de antes de que reciba los datos.
- El widget en una LockScreen (Android 4.0 y superior).
- El widget en una LockScreen antes de recibir cualquier dato (Android 4.0 y superior).
- Extender AppWidgetProvider. Esta clase proporciona métodos que se llaman durante un ciclo de vida de widgets.
- Proporcionar los metadatos AppWidgetProviderInfo. Información esencial sobre el widget, como anchura mínima y altura, frecuencia de actualización, y más.
- Añadir el widget a su manifiesto de aplicación.
1. Diseñar la disposición Widget
Lo primero que hacemos es diseñar nuestro diseño de widgets. Mientras que trazar un widget de aplicación es similar a la que pone a cabo una actividad y / o fragmento, hay un factor muy importante tener en cuenta. Diseños App Widget se basan en RemoteViews diseños. Esto significa que no todos Ver subclases pueden ser utilizados en un widget. De hecho, las clases solamente soportados son FrameLayout, LinearLayout, RelativeLayout, GridLayout, AnalogClock, Button, cronómetro, ImageButton, ImageView, ProgressBar, TextView, ViewFlipper, ListView, GridView, StackView y AdapterViewFlipper. Las subclases y descendientes de éstos ni siquiera son compatibles.
Con esto en mente, diseñamos nuestro widget de diseño, llamado simple_widget.xml
Nota android: padding en el fragmento de código de seguridad. A partir de Android 4.0, los widgets de aplicaciones obtienen automáticamente un acolchado entre el marco widget y los límites de widgets. Dispositivos Pre-4.0 sin embargo no proporcionan el relleno automático de widgets. Para construir un widget que tiene márgenes de versiones anteriores, pero no hay márgenes adicionales para 4.0 y superior, cree dos recursos dimensión res / valores / dimens.xml y res / valores-v14 / dimens.xml para proporcionar diferentes valores de margen de control, y establecer su targetSdkVersion a 14.
res / valores / dimens.xml
8DP
res / valores-v14 / dimes.xml
0DP
AppWidgetProvider Extendiendo
Ahora extender AppWidgetProvider, mediante la creación de la SimpleWidgetProvider clase. AppWidgetProvider tiene métodos que se llama cuando el widget aplicación se actualiza, borra, activado y desactivado, entre otros. Para nuestra aplicación, sólo sobrescribimos onUpdate (), ya que es el método llamado cada vez que se agrega el widget a un host.
public class SimpleWidgetProvider extiende AppWidgetProvider {Overridepublic vacío onUpdate (contexto Contexto, AppWidgetManager appWidgetManager, int [] appWidgetIds) {conteo final int = appWidgetIds.length-for (int i = 0- i lt; cuenta atrás i ++) {int moduloid = appWidgetIds [i] = número -string String.Format ("% 03d", (new Random () nextInt (900) + 100.)) - RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.simple_widget)-remoteViews.setTextViewText(R.id.textView, número) intención -Intent = new Intent (contexto, SimpleWidgetProvider.class)-intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)-intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds) -PendingIntent pendingIntent = PendingIntent.getBroadcast (contexto, 0, la intención, PendingIntent.FLAG_UPDATE_CURRENT) -remoteViews.setonclickPendingIntent (R.id.actionButton, pendingIntent) -appWidgetManager.updateAppWidget (moduloid, remoteViews) -}}}
En el método onUpdate () anterior, iteramos a través de todos nuestros widgets (en caso de que el usuario ha colocado varios widgets), obtener un objeto RemoteViews, actualizar TextView del RemoteView con un nuevo número aleatorio entre 100 y 999, y luego especificar la acción eso debería ocurrir cuando se pulsa el botón.
Para solicitar una actualización manual cuando se hace clic en el botón de actualización, se utiliza un PendingIntent. La acción para la Intención se establece en AppWidgetManager.ACTION_APPWIDGET_UPDATE. Esta es la misma acción enviado por el sistema cuando el widget necesita ser actualizado automáticamente. También indicamos los widgets que deben actualizarse (todos de los widgets app) llamando
intent.putExtra (AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds).
Para actualizar solamente el widget actual, puede llamar
intent.putExtra (AppWidgetManager.EXTRA_APPWIDGET_ID, moduloid) -
Por último, solicitamos el objeto AppWidgetManager para actualizar el widget aplicación, dándole el moduloid actual y el objeto RemoteViews actual.
Proporcionar metadatos AppWidgetProviderInfo
Este es un archivo XML que define información adicional, características y datos relacionados con el widget. Datos como dimensiones del diseño mínimas (ancho y alto), si el widget debe estar disponible en la pantalla de bloqueo (Android 4.2 y superior), con qué frecuencia se debe actualizar el widget, entre muchos otros. Definimos un archivo XML, llamado simple_widget_info.xml, y se guarda en la carpeta res / xml.
La mayor parte de los atributos tienen bonitos nombres auto explicativas. anchoMin y minHeight especifican el ancho mínimo y la altura el widget puede tener. updatePeriodMillis especifica la frecuencia de actualización en milisegundos para el widget. Tenga en cuenta que las actualizaciones frecuentes afectarán significativamente la batería usuarios. Tome nota del atributo widgetCategory. Especifica si el control puede estar disponible en la pantalla de bloqueo, así como en la pantalla de inicio. Todos los widgets están disponibles en la pantalla de inicio por defecto, y si no se especifican. Android 4.2 incluye la opción de bloqueo de teclas, lo que indica que el widget se puede agregar a la pantalla de bloqueo.
Si aparece el widget en la pantalla de bloqueo, es posible que desee para mostrar datos diferentes, o un diseño diferente. Para detectar si el widget está en una pantalla de bloqueo, solicita las opciones del widget usando getWidgetOptions de AppWidgetManager método (int moduloid). Este método devuelve un paquete, que se puede consultar para la int AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY. Esto ser un WIDGET_CATEGORY_HOME_SCREEN o WIDGET_CATEGORY_KEYGUARD.
El código de ejemplo siguiente comprueba la AppWidgetHost, y muestra un diseño diferente para cada tipo de host.
AppWidgetManager appWidgetManager-INT moduloid-Bundle myoptions = appWidgetManager.getAppWidgetOptions (moduloid) - // Obtener el valor de categoría OPTION_APPWIDGET_HOST_CATEGORYint = myOptions.getInt (AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1) - // Si el valor es WIDGET_CATEGORY_KEYGUARD, es una LockScreen widgetboolean isKeyguard = == categoría AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD-int = baselayout isKeyguard? R.layout.keyguard_widget_layout: R.layout.widget_layout-
Declarar Widget en la Aplicación Manifiesto
El último paso es añadir el widget de aplicación para el manifiesto de aplicación. Dentro de
No se olvide de cambiar el receptor android: nombre a su aplicación AppWidgetProvider, un androide el meta-datos: recurso para su archivo xml AppWidgetProviderInfo. En este punto, usted debería ser capaz de ejecutar la aplicación, y coloque su widget en cualquiera de la pantalla de inicio o en la pantalla de bloqueo.
Tocando en el botón de actualización debe actualizar automáticamente todos sus widgets. ¿Se puede modificar el código para actualizar sólo el widget que fue aprovechado? ¿Qué hay de la actualización de un solo widget de azar de barril? Diviértete con este, pero recuerda que un widget que se actualiza con frecuencia será un consumo de la batería.
Como de costumbre, el código completo está disponible para su modificación y reutilización hasta que te canses de github.