以编程方式从活动/服务/接收器更新小部件

Nuv*_*ous 93 android android-widget android-activity

我知道这是可能的,但我无法找到一种方法来触发主要活动的小部件更新.我可以播放一些一般意图吗?

小智 174

如果您正在使用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);
Run Code Online (Sandbox Code Playgroud)

  • @KrisB从下面的答案中,通过这样做得到数组:int ids [] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(),WidgetProvider.class)); (38认同)
  • 你在哪里设置`widgetId`? (30认同)
  • 你可以使用常量,不需要硬编码:`intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);` (11认同)
  • 对于 id:` int widgetIDs[] = AppWidgetManager.getInstance(activity).getAppWidgetIds(new ComponentName(activity, widget.class));` (5认同)
  • 不要关注@gelupa注释使用R.xml.mywidget for widgetID!这是完全错误的,只花了我4小时的调试!使用MobileMon解决方案获取正确的widgetID (3认同)

Stu*_*uck 71

当我搜索如何从服务/或动作更新小部件时(这可能来自每个上下文),这有助于:

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);
Run Code Online (Sandbox Code Playgroud)

  • 这应该被接受作为答案恕我直言 (3认同)
  • 效果很好-8年后。惊人 ! (2认同)

Voi*_*ode 29

因此,要从活动更新窗口小部件,您可以这样做:

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);
Run Code Online (Sandbox Code Playgroud)

适合我:)


Ole*_*ich 25

试试这个:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,只有这个小答案解决了它.我仍然不知道实例化Widget类并直接调用onUpdate方法的含义,但是,嘿,它最终工作:) (2认同)

tha*_*htd 14

如果您正在使用使用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);
Run Code Online (Sandbox Code Playgroud)

使用此方法notifyAppWidgetViewDataChanged(),您可以强制窗口小部件项目实时获取任何新数据.


Jak*_*son 11

int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}
Run Code Online (Sandbox Code Playgroud)


Com*_*are 5

只需获取一个AppWidgetManager实例并直接更新它.或者,如果您使用的是IntentService做更新,调用startService()IntentService.这AppWidgetProvider一种更新app小部件的方法,但这不是唯一的方法.

  • @Kratz:快点?没有.例子?是的:http://github.com/commonsguy/cw-andtutorials/tree/master/34-AdvAppWidget/LunchList/ (5认同)

Ell*_*lar 5

Phaethon 在 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)
Run Code Online (Sandbox Code Playgroud)

其中 MyAppWidgetProvider 派生自 AppWidgetProvider:

MyAppWidgetProvider : AppWidgetProvider() {
Run Code Online (Sandbox Code Playgroud)


gar*_*oke 5

如果您尝试以编程方式更新无法显式访问 YourWidgetProvider.class 的小部件(例如从另一个模块或库),您可以捕获 YourWidgetProvider.class.getName() 输出并创建一个常量:

val WIDGET_CLASS_NAME = "com.example.yourapplication.YourWidgetProvider"
Run Code Online (Sandbox Code Playgroud)

然后您就可以隐式地使用它:

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
val widgetManager = AppWidgetManager.getInstance(context)
val ids = widgetManager.getAppWidgetIds(ComponentName(context, WIDGET_CLASS_NAME))
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(ids, android.R.id.list)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
Run Code Online (Sandbox Code Playgroud)