Attualmente sto imparando a conoscere i widget in Android.Come aggiornare un widget in modo dinamico (non è necessario attendere 30 minuti per chiamare onUpdate)?
Voglio creare un widget WIFI che visualizzerà l'SSID, il livello (segnale) RSSI.
ma voglio anche essere in grado di inviare i dati da un servizio sto facendo funzionare che calcola la qualità del suono tramite WiFi.
Ecco quello che ho dopo un po 'di lettura e un breve 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);
}
}
È possibile che questo sembra funzionare bene, si aggiorna lo SSID sul widget ogni 10 secondi.
Tuttavia ciò che è il modo più efficiente per ottenere le informazioni dal mio servizio che sarà già in esecuzione per aggiornare periodicamente il mio widget di?
Inoltre è ci un approccio migliore per l'aggiornamento del widget piuttosto che utilizzare un timer e TimerTask? (Evitare polling)
UPDATE
Come da suggerimento di Karan ho aggiunto il seguente codice nel mio servizio:
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);
Questo viene eseguito ogni volta che cambia il livello RSSI ma non aggiorna mai la TextView sul mio widget, qualche idea per quale motivo?
EDIT
ottenuto che funziona, grazie Karan
Questa è la mia soluzione, come aggiornare automaticamente il widget più frequentemente dei 30 minuti. Io uso AlarmManager: http://stackoverflow.com/questions/5476867/updating-app-widget-using-alarmmanager/#answer-14319020 – petrnohejl