2011-09-22 17 views
9

Quindi, ho un widget, lo voglio aggiornare ogni 60 secondi. Quando il widget viene aggiunto per la prima volta alla schermata iniziale, esegue correttamente la sua funzione di aggiornamento. Oltre a ciò, è necessario avviare un AlarmManager, che eseguirà nuovamente il metodo di aggiornamento ogni 60 secondi. Questa è la parte che sembra non fare in realtà. Qui è il mio codice:AppWidget alarmmanager non si aggiorna

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); 
      } 
     } 
    } 

} 

E 'il prodotto di un qualche tutorial che ho trovato in materia, e la mia conoscenza di Android. Secondo i miei logcats, non arriva mai al Log.d ("onReceive", "Clock update"); linea. E sì, il mio manifest è impostato con l'intento di aggiornamento dell'orologio. Grazie!

MODIFICA: Ulteriori informazioni. Inserisco una riga di log nel metodo createClockTickIntent e si attiva. Quindi immagino che questo significhi che la mia applicazione stia eseguendo la riga alarmManager.setRepeating, non ho idea del perché non si stia effettivamente ripetendo.

+1

Anche se hai risolto il tuo problema correggendo un errore di ortografia, grazie per aver postato questo - è la dimostrazione più concisa e semplice di come usare AlarmManager per aggiornare appwidgets che ho visto ovunque! Ci sono così tante soluzioni orribilmente complicate là fuori, ma tutto ciò viene tagliato, con un metodo che è semplice da capire e implementare. Grazie! – drmrbrewer

risposta

3

Arggghhh, era un semplice errore di battitura. Il filtro intent era "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE" e avevo scritto "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"

Che dolore, ma hey, ora lo so.

Quindi, morale della storia per chiunque abbia un problema simile a me: Controlla l'ortografia! Controllalo due volte o dieci volte. Su tutto!

+2

o semplicemente copia/incolla sempre :-) (grazie per la domanda, btw! È stato molto utile vedere come hai fatto Questo) –

-4

È necessario creare un appwidget-provider e impostare updatePeriodMillis su 0,6 secondi, quindi verrà aggiornato per 60 secondi.

<?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

Mi dispiace, lo so che non è corretto. Ho un appwidget-provider, per cominciare, ma updatePeriodMillis non può essere inferiore a 30 minuti, motivo per cui devo usare un AlarmManager. Inoltre, 60 millisecondi sarebbero 0,6 secondi, non 60 secondi. Grazie mille per aver risposto – Nick

+0

@Nick, hai ragione, ma sei sicuro che updatePeriodMillis non può essere inferiore a 30 minuti? Perché realizzo un widget e lo applico in 10 minuti e ha funzionato. –

+1

Sì, sono stati limitati a 30 minuti da Android 1.6 – Nick