Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force Android widget to update

I respond to a button press on my appwidget in the onreceive method. When the button I pressed, I want to force the widget to call the onupdate method. How do I accomplish this?

Thanks in advance!

like image 357
strange quark Avatar asked May 01 '10 02:05

strange quark


People also ask

Why are my widgets not updating?

Check your internet connectivity Just like apps, most Android widgets need a stable internet connection to work. For example, widgets like weather, news, or Gmail, need to connect to the internet to give you up-to-date data. Make this the first thing you check if you encounter issues with your Android widgets.

Why are my widgets not showing up Android?

The most common reason for a widget to disappear is when Android users transfer applications to a memory card. Widgets may also disappear after the hard reboot of your device. To return it, you need to transfer them again to the phone's memory.


2 Answers

Widget can't actually respond to clicks because it's not a separate process running. But it can start service to process your command:

public class TestWidget extends AppWidgetProvider {
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch UpdateService
            Intent intent = new Intent(context, UpdateService.class);
            PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current App Widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

    public static class UpdateService extends Service {
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
          //process your click here
          return START_NOT_STICKY;
        }
    }
}

You should also register the new service in your manifest file:

<service android:name="com.xxx.yyy.TestWidget$UpdateService">

You can find another example of UpdateService implementation in Wiktionary sample in SDK

And here's another good approach Clickable widgets in android

like image 151
Fedor Avatar answered Sep 19 '22 23:09

Fedor


This is kinda crude, but it works rather well for me, as I've found no directly-implemented way to force an update.

public class Foo extends AppWidgetManager {
   public static Foo Widget = null;
   public static Context context;
   public static AppWidgetManager AWM;
   public static int IDs[];

   public void onUpdate(Context context, AppWidgetManager AWM, int IDs[]) {
      if (null == context) context = Foo.context;
      if (null == AWM) AWM = Foo.AWM;
      if (null == IDs) IDs = Foo.IDs;

      Foo.Widget = this;
      Foo.context = context;
      Foo.AWM = AWM;
      Foo.IDs = IDs;
.......
   }
}

Now, anywhere I want to force the widget to update, it's as simple as:

if (null != Foo.Widget) Foo.Widget.onUpdate(null, null, null);
like image 43
Izkata Avatar answered Sep 18 '22 23:09

Izkata