Программное обновление виджета из activity / service / receiver
Я знаю, что это возможно, но я не могу понять, как вызвать обновление моего виджета из основной деятельности. Есть ли какое-то общее намерение, которое я могу транслировать?
8 ответов:
Если вы are С помощью
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()) .getAppWidgetIds(new ComponentName(getApplication(), MyAppWidgetProvider.class)); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); sendBroadcast(intent);
это помогло, когда я искал на Как обновить виджет из сервиса / или действия (но может быть возможно из любого контекста):
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);
Итак, чтобы обновить виджет из действия, вы можете сделать это следующим образом:
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);
работает для меня :)
попробуйте это:
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); }
Если вы работаете с виджетом, который использует коллекцию, такую как 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 () можно заставить элементы виджета извлекать любые новые данные в режиме реального времени.
просто
AppWidgetManager
экземпляр и обновить ее прямо. Или, если вы используетеIntentService
чтобы сделать обновления, позвонитеstartService()
наIntentService
. ЭлементAppWidgetProvider
и a способ обновить виджет приложения, но это не единственный способ.
принятое решение Фаэтона в Котлине:
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() {