2011-09-22 19 views
9

Mam widżet, chcę go aktualizować co 60 sekund. Kiedy widget jest po raz pierwszy dodany do ekranu głównego, uruchamia swoją funkcję aktualizacji. Poza tym powinien uruchomić AlarmManager, który będzie ponownie uruchamiał metodę aktualizacji co 60 sekund. To jest ta część, której tak naprawdę nie robi. Oto mój kod:AppManager nie aktualizuje się

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

} 

Jest produktem kilku tutoriali znalazłem w tej sprawie, a moja własna wiedza o Androidzie. Według moich logcats, nigdy nie dostaje się do Log.d ("onReceive", "Aktualizacja zegara"); linia. I tak, mój Manifest jest skonfigurowany z myślą o aktualizacji zegara. Dzięki!

EDYCJA: Dodatkowe informacje. Umieściłem wiersz dziennika w metodzie createClockTickIntent i odpalam. Myślę więc, że oznacza to, że moja aplikacja uruchamia linię alarmManager.setRepeating, nie wiem, dlaczego tak naprawdę nie jest powtarzana.

+1

Mimo że rozwiązałeś swój problem, poprawiając błąd w pisowni, dziękuję za opublikowanie tego - jest to najbardziej zwięzła i prosta demonstracja użycia AlarmManagera do aktualizowania aplikacji, które widziałem gdziekolwiek! Istnieje wiele strasznie skomplikowanych rozwiązań, ale przecina to wszystko dzięki metodzie łatwej do zrozumienia i wdrożenia. Dzięki! – drmrbrewer

Odpowiedz

3

Arggghhh, to był prosty literówka. Filtr zamiaru to "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE", a ja napisałem "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE"

Co za ból, ale hej, teraz już wiem.

Tak, moralny z historii dla każdego, kto ma podobny problem do mnie: Sprawdź pisownię! Sprawdź to dwa razy lub dziesięć razy. Na wszystko!

+2

lub po prostu zawsze kopiuj/wklej :-) (dzięki za pytanie, btw! To było bardzo pomocne, widząc, jak to zrobiłeś to) –

-4

Musisz wykonać appwidget-provider i ustawić updatePeriodMillis na 0,6 sekundy, a następnie będzie aktualizowany przez 60 sekund.

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

Przykro mi, wiem, że to nie jest poprawne. Na początku mam dostawcę appwidget, ale updatePeriodMillis nie może mieć mniej niż 30 minut, dlatego muszę używać programu AlarmManager. Ponadto 60 milisekund to 0,6 sekundy, a nie 60 sekund. Bardzo dziękuję za odpowiedź – Nick

+0

@Nick, Masz rację, Ale czy jesteś pewien, że updatePeriodMillis nie może być krótszy niż 30 minut? Ponieważ robię widżet i ustawię go na 10 minut i działa. –

+1

Tak, zostały ograniczone do 30 minut od Androida 1.6 – Nick

Powiązane problemy