2011-09-22 12 views
9

Por lo tanto, tengo un widget, quiero que se actualice cada 60 segundos. Cuando el widget se agrega por primera vez a la pantalla de inicio, ejecuta su función de actualización muy bien. Más allá de eso, se supone que debe iniciar un AlarmManager, que volverá a ejecutar el método de actualización cada 60 segundos. Esa es la parte que no parece estar realmente haciendo. Aquí está mi código:AppWidget alarmmanager no se está actualizando

public class ClockWidget extends AppWidgetProvider { 

    public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) { 
     final int N = appWidgetIds.length; 
     for (int i = 0; i < N; i++) { 
      int appWidgetId = appWidgetIds[i]; 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout); 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
      updateAppWidget(context, appWidgetManager, appWidgetId); 
     } 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 
     Log.d("log","Entered update cycle"); 
     //Unimportant for these purposes 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 


    private PendingIntent createClockTickIntent(Context context) { 
     Intent intent = new Intent(CLOCK_WIDGET_UPDATE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     return pendingIntent; 
    } 

    @Override 
    public void onEnabled(Context context) { 
     super.onEnabled(context); 
     Log.d("onEnabled","Widget Provider enabled. Starting timer to update widget every minute"); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context)); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     super.onDisabled(context); 
     Log.d("onDisabled", "Widget Provider disabled. Turning off timer"); 
     AlarmManager alarmManager = (AlarmManager) context 
     .getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(createClockTickIntent(context)); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     Log.d("onReceive", "Received intent " + intent); 
     if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) { 
      Log.d("onReceive", "Clock update"); 
      // Get the widget manager and ids for this widget provider, then 
      // call the shared 
      // clock update method. 
      ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName()); 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      for (int appWidgetID: ids) { 
       updateAppWidget(context, appWidgetManager, appWidgetID); 
      } 
     } 
    } 

} 

Es el producto de algunos tutoriales que he encontrado en la materia, y mi propio conocimiento de Android. De acuerdo con mis logcats, nunca llega al Log.d ("onReceive", "Clock update"); línea. Y sí, mi Manifiesto está configurado con la intención de actualización del reloj. ¡Gracias!

EDITAR: Información adicional. Puse una línea de registro en el método createClockTickIntent, y se dispara. Así que supongo que esto significa que mi aplicación está ejecutando la línea alarmManager.setRepeating, no tengo idea de por qué no se está repitiendo realmente.

+1

Aunque resolvió su propio problema corrigiendo un error ortográfico, gracias por publicarlo - ¡es la demostración más concisa y simple de cómo usar AlarmManager para actualizar las aplicaciones que he visto en cualquier lugar! Hay tantas soluciones terriblemente complicadas, pero esto abarca todo eso, con un método que es simple de comprender e implementar. ¡Gracias! – drmrbrewer

Respuesta

3

Arggghhh, era un error simple. El filtro de intención era "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE", y yo había escrito "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"

Qué pena, pero bueno, ahora lo sé.

Así que, la moraleja de la historia para cualquiera con un problema similar para mí: ¡revise su ortografía! Verifíquelo dos o diez veces. ¡En todo!

+2

o simplemente siempre copio/pego :-) (gracias por la pregunta, por cierto! Fue muy útil ver cómo lo hizo esta) –

-4

Tienes que hacer un appwidget-provider y establecer updatePeriodMillis en 0,6 segundos, luego se actualizará cada 60 segundos.

<?xml version="1.0" encoding="utf-8" ?> 
<appwidget-provider 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="146dp" 
android:initialLayout="@layout/YourLayout" 
android:updatePeriodMillis="0.6" 
android:minHeight="144dp"/> 
+1

Lo siento, sé que eso no es correcto. Tengo un appwidget-provider, para empezar, pero updatePeriodMillis no puede ser inferior a 30 minutos, por lo que tengo que usar un AlarmManager. Además, 60 milisegundos serían 0.6 segundos, no 60 segundos. Muchas gracias por responder – Nick

+0

@Nick, tienes razón, pero ¿estás seguro de que updatePeriodMillis no puede ser inferior a 30 minutos? Porque hago un widget y lo configuro en 10 minutos y funcionó. –

+1

Sí, han estado restringidos a 30 minutos desde Android 1.6 – Nick

Cuestiones relacionadas