Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to update a Widget dynamically (Not waiting 30 min for onUpdate to be called)?

I am currently learning about widgets in Android.

I want to create a WIFI widget that will display the SSID, the RSSI (Signal) level.

But I also want to be able to send it data from a service I am running that calculates the Quality of Sound over wifi.

Here is what I have after some reading and a quick 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);
}

}

The above seems to work ok, it updates the SSID on the widget every 10 seconds.

However what is the most efficent way to get the information from my service that will be already running to update periodically on my widget?

Also is there a better approach to updating the the widget rather than using a timer and timertask? (Avoid polling)

UPDATE

As per Karan's suggestion I have added the following code in my Service:


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 );

This gets run everytime the RSSI level changes but it still never updates the TextView on my widget, any ideas why?

EDIT

Got it working, thanks Karan

like image 282
Donal Rafferty Avatar asked May 28 '10 13:05

Donal Rafferty


People also ask

How do you update widgets?

Full update: Call AppWidgetManager. updateAppWidget(int, android. widget. RemoteViews) to fully update the widget.

How often do Iphone widgets update?

For a widget the user frequently views, a daily budget typically includes from 40 to 70 refreshes. This rate roughly translates to widget reloads every 15 to 60 minutes, but it's common for these intervals to vary due to the many factors involved. The system takes a few days to learn the user's behavior.


1 Answers

You can use the following code to update the data of widget :

ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );
like image 136
Karan Avatar answered Sep 30 '22 07:09

Karan