2010-05-28 3 views
15

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

+0

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

risposta

23

È possibile utilizzare il seguente codice per aggiornare i dati di widget:

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

Posso metterlo al mio servizio e aggiornerà il Widget in modo dinamico? –

+0

No, questo è il codice che usi per attivare l'aggiornamento (ho usato le 4 righe sopra alla fine della domanda). L'ho fatto aggiungendo un intento in sospeso a un pulsante di aggiornamento sul mio widget. Quando premuto, quell'intenzione ha sparato una trasmissione per un'azione personalizzata. Ho preso questa azione nel metodo onReceive nel mio WidgetProvider e poi ho eseguito questo codice. Funziona alla grande! Grazie! – RealCasually

1

Se si guarda al documentation about widgets, si suppone di essere in grado di impostare un tempo compreso tra 2 aggiornamenti:

<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 questo, dovresti essere in grado di inserire qualsiasi periodo desiderato? (Si dice che l'aggiornamento potrebbe non avvenire direttamente dopo la chiamata, quindi è necessario farlo il più spesso possibile, ma è necessario occuparsi della batteria)

+6

da 1,6 l'aggiornamento minima del sistema operativo consentirà ed eseguire è di 30 minuti appart per salvare la vita della batteria . Ho bisogno di essere in grado di aggiornare il Widget ogni volta che il livello RSSI cambia in modo significativo, i cambiamenti punto di accesso WiFi e quando la QoS calcolati dal mio servizio scende al di sotto o al di sopra salite di un certo livello. Tutti richiedono un aggiornamento dinamico sul Widget. –