2010-01-16 20 views
33

Sto cercando di implementare un semplice widget per la visualizzazione sulla schermata principale. Il problema che sto vivendo è che onUpdate viene chiamato una sola volta quando installo il widget. La configurazione è sotto. Nota: non lascerò il periodo di aggiornamento a 20 secondi poiché so che ucciderebbe la batteria (solo test).Widget Android non si aggiorna

Configurazione:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="72dp" 
    android:updatePeriodMillis="20000" 
    android:initialLayout="@layout/my_custom_app_widget">` 
</appwidget-provider>` 

manifesto Estratto:

<receiver android:name="MyCustomWidgetProvider"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" 
     android:resource="@xml/my_custom_app_widget_info" /> 
</receiver> 

sto osservando il seguente comportamento quando installo il widget: Nella mia classe WidgetProvider su OnReceive è chiamato quindi onEnabled poi OnReceive, poi onUpdate.

Successivamente, il widget viene visualizzato e onUpdate non viene più richiamato. Controllo anche le impostazioni del provder quando viene chiamato onUpdate e tutto ciò che è impostato in XML sopra (ad esempio, periodo di aggiornamento) è corretto.

risposta

67

Mentre si dispone di android:updatePeriodMillis impostato su 20 secondi, il tempo effettivo minimo è 30 minuti. Quindi, se non hai atteso 30 minuti per vedere se c'è un aggiornamento durante i test, dovrai aspettare ancora un po '.

+3

Grazie. Stavo andando su una linea attraverso i documenti e loro non ne hanno parlato. Tuttavia, in base alla tua risposta, ho notato che sto guardando 1.5 documenti. Il minimo è documentato e apparentemente c'è un approccio di allarme se è necessaria una frequenza di aggiornamento più alta. Grazie. – phogel

+2

Informazioni sull'orologio o sull'aggiornamento del tempo Widget? Come sono aggiornati. –

+3

Se qualcuno di voi sta costruendo un'API: non è così che si fa. Se sono presenti restrizioni all'intervallo di valori, renderlo assolutamente chiaro al consumatore non riuscendo in fase di compilazione o nel caso peggiore di runtime. – Nilzor

18

Dal SDK:

Nota: Se il dispositivo è addormentato quando è il momento per un aggiornamento (come definito dalla updatePeriodMillis), allora il dispositivo si riattiverà al fine di eseguire l'aggiornamento. Se non si aggiorna più di una volta all'ora, questo probabilmente non causerà problemi significativi alla durata della batteria.

Se, tuttavia, è necessario eseguire l'aggiornamento più frequentemente e/o non è necessario effettuare l'aggiornamento mentre il dispositivo è in stato di riposo, è possibile eseguire gli aggiornamenti in base a un allarme che non riattiva il dispositivo.

Per fare ciò, impostare un allarme con un Intento ricevuto dal proprio AppWidgetProvider utilizzando AlarmManager. Impostare il tipo di allarme su ELAPSED_REALTIME o RTC, che invierà l'allarme solo quando il dispositivo è attivo. Quindi impostare updatePeriodMillis su zero ("0").

E quando SDK 1.6 +:

Nota: aggiornamenti richiesti con updatePeriodMillis non saranno consegnati più di una volta ogni 30 minuti.

1

come diceva duduli ... utilizzare un alarmManager per inviare un intento alla classe Widget, lo riceverà nel suo metodo onReceive, se non si sa come farlo seguire this guide. Ha funzionato per me e altri

Problemi correlati