android - tutorial - ¿Cómo actualizar un Widget dinámicamente(No está esperando 30 minutos para que se llame a la Actualización)?
widget programming android (2)
Actualmente estoy aprendiendo sobre widgets en Android.
Quiero crear un widget de WIFI que muestre el SSID, el nivel RSSI (Señal).
Pero también quiero poder enviar datos desde un servicio que estoy ejecutando y que calcula la calidad del sonido a través de wifi.
Aquí está lo que tengo después de un poco de lectura y un tutorial rápido:
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, actualiza el SSID en el widget cada 10 segundos.
Sin embargo, ¿cuál es la forma más eficaz de obtener la información de mi servicio que ya se estará ejecutando para actualizar periódicamente mi widget?
¿También hay un mejor enfoque para actualizar el widget en lugar de usar un temporizador y timertask? (Evita las encuestas)
ACTUALIZAR
Según la sugerencia de Karan, he añadido el siguiente código 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 ejecuta cada vez que cambia el nivel de RSSI, pero aún así nunca se actualiza TextView en mi widget, ¿alguna idea de por qué?
EDITAR
Lo tengo funcionando, gracias Karan
Puede utilizar el siguiente código para actualizar los datos del widget:
ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );
Si consulta la documentación sobre los widgets , se supone que debe poder 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ías poder poner el periodo que quieras? (Menciona que la actualización podría no ocurrir directamente después de su llamada y, por lo tanto, debe hacerlo con la mayor frecuencia posible, pero debe cuidar la batería)