Question

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!

Was it helpful?

Solution

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

OTHER TIPS

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);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top