Программно обновить виджет из деятельности / службы / получателя - PullRequest
91 голосов
/ 11 августа 2010

Я знаю, что это возможно, но я не могу найти способ вызвать обновление моего виджета из основного действия. Разве нет общего намерения, которое я могу транслировать?

Ответы [ 8 ]

170 голосов
/ 12 октября 2011

Если вы используете AppWidgetProvider, вы можете обновить его следующим образом:

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);
68 голосов
/ 10 декабря 2010

Это помогло, когда я искал на , как обновить виджет из службы / или действия (но возможно из любого контекста):

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);
28 голосов
/ 10 января 2013

Таким образом, чтобы обновить виджет из действия, вы можете сделать это так:

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

у меня работает :)

24 голосов
/ 06 марта 2014

Попробуйте это:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);
13 голосов
/ 02 июля 2014

Если вы работаете с виджетом, который использует коллекцию, такую ​​как ListView, GridView или StackView, для обновления элементов виджета, выполните следующие действия:

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

С помощью этого метода notifyAppWidgetViewDataChanged () вы можете заставить элементы виджета извлекать любые новые данные в режиме реального времени.

11 голосов
/ 05 сентября 2012
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}
5 голосов
/ 11 августа 2010

Просто получите экземпляр AppWidgetManager и обновите его напрямую. Или, если вы используете IntentService для обновления, позвоните startService() на IntentService. AppWidgetProvider - это способ обновления виджета приложения, но это не единственный способ.

0 голосов
/ 18 апреля 2018

Фаэтон принял решение в Котлине:

    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)

Где MyAppWidgetProvider является производным от AppWidgetProvider:
class MyAppWidgetProvider : AppWidgetProvider() {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...