2010-05-28 13 views
15

Actualmente estoy aprendiendo sobre widgets en Android.Cómo actualizar un widget dinámicamente (No esperando 30 min para que se llame onUpdate)?

Quiero crear un widget WIFI que muestre el SSID, el nivel de RSSI (señal).

Pero también quiero poder enviarle datos de un servicio que estoy ejecutando que calcula la calidad del sonido a través de wifi.

Aquí es lo que tengo después de un poco de lectura y un rápido tutorial:


public class WlanWidget extends AppWidgetProvider{ 

RemoteViews remoteViews; 
AppWidgetManager appWidgetManager; 
ComponentName thisWidget; 
WifiManager wifiManager; 

public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new WlanTimer(context, appWidgetManager), 1, 10000); 

} 


private class WlanTimer extends TimerTask{ 

     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 


public WlanTimer(Context context, AppWidgetManager appWidgetManager) { 

     this.appWidgetManager = appWidgetManager; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
     thisWidget = new ComponentName(context, WlanWidget.class); 
     wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 


} 

@Override 
public void run() { 

     remoteViews.setTextViewText(R.id.widget_textview, 
     wifiManager.getConnectionInfo().getSSID()); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
} 

} 

Lo anterior parece funcionar bien, se actualiza el SSID en el widget cada 10 segundos.

Sin embargo, ¿cuál es la forma más eficiente de obtener la información de mi servicio que ya se está ejecutando para actualizar periódicamente en mi widget?

También hay un mejor enfoque para actualizar el widget en lugar de usar un temporizador y un reloj? (Evitar sondeo)

ACTUALIZACIÓN

según la sugerencia de Karan He añadido el código siguiente en mi servicio:


RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
ComponentName thisWidget = new ComponentName(context, WlanWidget.class); 
remoteViews.setTextViewText(R.id.widget_QCLevel, " " + qcPercentage); 
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, remoteViews); 

Esto se ejecute cada vez que cambia el nivel de RSSI pero todavía no actualiza el TextView en mi widget, ¿alguna idea de por qué?

EDITAR

tengo trabajo, gracias Karan

+0

Esta es mi solución, cómo actualizar el widget automáticamente con más frecuencia que los 30 minutos. Uso AlarmManager: http://stackoverflow.com/questions/5476867/updating-app-widget-using-alarmmanager/#answer-14319020 – petrnohejl

Respuesta

23

Puede usar el siguiente código para actualizar los datos de widget:

ComponentName thisWidget = new ComponentName(getContext(), <ProviderClass>); 
AppWidgetManager.getInstance(getContext()).updateAppWidget(thisWidget, rempoteViews);
+0

¿Puedo poner eso en mi servicio y actualizará el widget dinámicamente? –

+0

No, este es el código que usa para activar la actualización (utilicé las 4 líneas anteriores al final de la pregunta). Lo hice agregando un intento pendiente a un botón de actualización en mi widget. Cuando se presiona, esa intención dispara una transmisión para una acción personalizada. Capté esta acción en el método onReceive en mi WidgetProvider y luego ejecuté este código. ¡Funciona genial! ¡Gracias! – RealCasually

1

Si nos fijamos en la documentation about widgets, se supone que para ser capaz de establecer un tiempo entre 2 actualizaciones:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="294dp" 
android:minHeight="72dp" 
android:updatePeriodMillis="86400000" 
android:initialLayout="@layout/example_appwidget" 
android:configure="com.example.android.ExampleAppWidgetConfigure" > 

Con esto, ¿debería poder poner el período que desee? (Menciona que la actualización podría no producirse inmediatamente después de su llamada y, por lo tanto, debe hacerlo con la mayor frecuencia posible, pero debe cuidar la batería)

+6

A partir de 1.6, la actualización mínima que el sistema operativo permitirá y realizará es de 30 minutos para ahorrar batería. . Necesito poder actualizar el widget cada vez que el nivel de RSSI cambia significativamente, el punto de acceso WiFi cambia y cuando la QoS calculada de mi servicio cae por debajo o sube por encima de un cierto nivel. Todos los cuales necesitan actualización dinámica en el Widget. –

Cuestiones relacionadas