2010-01-16 52 views
33

Estoy tratando de implementar un widget simple para mostrar en la pantalla de inicio. El problema que estoy experimentando es que onUpdate solo se llama una vez cuando instalo el widget. La configuración está abajo. Nota: No dejaré el período de actualización en 20 segundos, ya que sé que mataría la batería (solo está probando).Android Widget Not Updating

Configuración:

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

Manifiesto Extracto:

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

que estoy observando el comportamiento siguiente cuando instalo el widget: En mi clase WidgetProvider en OnReceive se llama entonces onEnabled continuación OnReceive, a continuación, onUpdate.

Después de eso se visualiza el widget y nunca se vuelve a llamar a OnUpdate. También inspecciono la configuración del provder cuando se llama a onUpdate y todo lo establecido en el XML anterior (por ejemplo, el período de actualización) es correcto.

Respuesta

67

Mientras tiene android:updatePeriodMillis establecido en 20 segundos, el tiempo real mínimo es de 30 minutos. Entonces, si no ha estado esperando 30 minutos para ver si hay una actualización durante su prueba, necesitará esperar un poco más.

+3

Gracias. Estaba yendo línea por línea a través de los documentos y ellos no mencionaron eso. Sin embargo, según su respuesta, profundicé y me di cuenta de que estoy viendo 1.5 documentos. El mínimo está documentado y aparentemente hay un enfoque de alarma si se necesita una frecuencia de actualización más alta. Gracias. – phogel

+2

¿Qué hay del reloj o de la actualización meteorológica de los widgets? Cómo se actualizan –

+3

Si alguno de ustedes está creando una API: esta no es la forma de hacerlo. Si hay restricciones en el rango de valores, hágalo absolutamente claro para el consumidor al fallar en tiempo de compilación o en el peor de los casos. – Nilzor

18

Desde el SDK:

Nota: Si el dispositivo está dormido cuando es el momento para una actualización (como se define por updatePeriodMillis), entonces el dispositivo se activará con el fin de realizar la actualización. Si no actualiza más de una vez por hora, esto probablemente no ocasione problemas significativos para la duración de la batería.

Sin embargo, si necesita actualizar con más frecuencia y/o no necesita actualizar mientras el dispositivo está dormido, entonces puede realizar actualizaciones basadas en una alarma que no activará el dispositivo.

Para hacerlo, configure una alarma con un Intento que su AppWidgetProvider recibe, usando el AlarmManager. Establezca el tipo de alarma en ELAPSED_REALTIME o RTC, que solo emitirá la alarma cuando el dispositivo esté en funcionamiento. Luego configure updatePeriodMillis en zero ("0").

Y cuando SDK 1.6 +:

Nota: actualizaciones solicitadas con updatePeriodMillis no se entregarán más de una vez cada 30 minutos.

1

como duduli dijo ... use un alarmManager para enviar un intento a su clase de widget, lo recibirá en su método onReceive, si no sabe cómo hacerlo, siga this guide. Funcionó para mí y otros