Actualizar widget programáticamente desde actividad / servicio / receptor

Sé que es posible, pero no puedo encontrar una manera de activar una actualización de mi widget de la actividad principal. ¿No hay alguna intención general que pueda transmitir?

Si está utilizando un AppWidgetProvider , puede actualizarlo de esta manera:

 Intent intent = new Intent(this, MyAppWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, // since it seems the onUpdate() is only fired on that: int[] ids = AppWidgetManager.getInstance(getApplication()) .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class)); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); sendBroadcast(intent); 

Esto me ayudó cuando busqué la forma de actualizar un widget desde un servicio o acción (pero puede ser posible desde cualquier contexto):

 Context context = this; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1); ComponentName thisWidget = new ComponentName(context, MyWidget.class); remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis()); appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

Entonces, para actualizar un widget de una actividad, puedes hacerlo así:

 Intent intent = new Intent(this, DppWidget.class); intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class)); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); sendBroadcast(intent); 

Funciona para mi 🙂

Prueba esto:

 int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class)); MyWidget myWidget = new MyWidget(); myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids); 
 int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class)); for (int id : widgetIDs) AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view); } 

En caso de que esté trabajando con un widget que utiliza una colección como ListView, GridView o StackView, para actualizar los elementos del widget, haga lo siguiente:

 Context context = getApplicationContext(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view); 

Con este método notifyAppWidgetViewDataChanged (), puede forzar a los elementos del widget a buscar cualquier dato nuevo en tiempo real.

Simplemente obtenga una instancia de AppWidgetManager y actualícela directamente. O bien, si está utilizando un IntentService para hacer las actualizaciones, llame a startService() en IntentService . AppWidgetProvider es una forma de actualizar el widget de la aplicación, pero no es la única.

La solución aceptada por Faetón en Kotlin:

  val intent = Intent(this, MyAppWidgetProvider::class.java) intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(),MyAppWidgetProvider::class.java!!)) intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) sendBroadcast(intent) 

Donde MyAppWidgetProvider se deriva de AppWidgetProvider:
class MyAppWidgetProvider : AppWidgetProvider() {