2011-04-19 27 views
10

Hola Escribo un widget de Android; quería actualizarlo cada 1-5 minutos para controlar los datos del servicio web, pero descubrí que android: updatePeriodMillis no puede ser inferior a 30 minutos ... ¿cómo puedo obtener este resultado con un Widget?Actualización de widgets de Android cada 1 minuto

Gracias y saludos c.

Respuesta

16

Registre un servicio AlarmManager para cada llamada de 1 minuto.

final Intent intent = new Intent(context, UpdateService.class); 
final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); 
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.cancel(pending); 
long interval = 1000*60; 
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),interval, pending); 

Sin embargo, empujar las actualizaciones a los widgets de la aplicación es una operación costosa. Actualizar cada 1 minuto obligaría a su código de "actualizar un widget de aplicación" a permanecer en la memoria, que se mantiene funcionando todo el tiempo, y esto también consumirá la batería de manera significativa.

+0

¿Dónde se supone que debemos poner este código? Como un principiante de Android, no me ayuda ... – Virthuss

+0

¿se debe poner esto en el método 'onUpdate'? – natsumiyu

+1

Esto no funciona correctamente para Android 6.0+. El modo Doze generalmente no funciona bien con 'setRepeating()'. Intenté todo, incluso 'setExactAndAllowWhileIdle()' cada vez que se activa la alarma, pero no se apaga o se apaga demasiado tiempo después del minuto 1 que deseo. – Nikiforos

1

Utilice Handler para sendMessageDelayed(..) un mensaje o postDelayed(..) a Runner.

new Handler().postDelayed(new Runnable() { 
    public void run() { ... }, 
    60000 /* one minute */ 
); 
+1

La respuesta aceptada aquí: http://stackoverflow.com/questions/5671984/android-substuting-the-click-with-a-timer/5672264#5672264 da un muy buen ejemplo del uso de un controlador y postDelayed – Maximus

+0

This supone que tiene un código en ejecución constante que actualizará el widget de la aplicación. Esta es una suposición errónea o una idea realmente mala. – CommonsWare

+1

Si el usuario significa widget de escritorio, como en la clase android.appwidget, entonces sí, estoy de acuerdo, la respuesta de Priyank es correcta. Sin embargo, si el usuario significa vista personalizada, como algo de la clase android.widget, entonces eso implica un árbol de vista asociado a una actividad, que era mi suposición original. (¿Por qué oh por qué desarrollaron el nombre de "widget"?) – Anm

Cuestiones relacionadas