Force Android widget to update

房东的猫 提交于 2019-11-30 04:09:30
Fedor

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

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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!