从活动更新Android小部件

我有一个小部件,它的设置,以便当我点击它时,它会在活动中打开一些设置。

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

这会为应用程序配置一些设置。 我想要实现的是让窗口小部件更新其视图以反映活动I启动关闭时更改的设置。 使用更新间隔或任何其他types的轮询不适合此。

我在这里看到了几个地方,在android文档中使用了这段代码:

 appWidgetManager.updateAppWidget(mAppWidgetId, views); 

但我不知道如何获得mAppWidgetId值。 我尝试按照http://developer.android.com/guide/topics/appwidgets/index.html中的小部件配置活动示例,但在以下代码中,

  Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { mAppWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } 

extras总是为null,所以我永远不会得到AppWidgetID。

好的,现在我只是漫无边际。 你觉得我能做什么?

我终于find了我正在寻找的答案,它是在updateAppWidget函数的重载中。

  appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); 

这让我可以访问小部件而无需知道appWidgetID。 我的活动中的最终代码是:

  // Create an Intent to launch ExampleActivity Intent intent = new Intent(this, Settings.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views); finish(); 

我必须在Widget的onUpdate方法中执行所有相同的设置操作,但现在每次退出活动时,Widget都会显示正确的状态。

还有另一种方法 – 在用于启动活动的待定意图中传递窗口小部件ID:

 Intent clickIntent=new Intent(context, MyConfigActivity.class); clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); // you have the widgetId here, since it's your onUpdate PendingIntent pendingIntent=PendingIntent .getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent); 

此外,为了避免来自onUpdate()的代码重复,您可以将意图广播回AppWidgetProvider:

 Intent intent = new Intent(this,MyAppWidgetProvider.class); intent.setAction("android.appwidget.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 = {widgetId}; intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); sendBroadcast(intent); 

我知道这已经得到了回答和接受。 然而,当我搜索相同的东西时,我遇到了一个非常简单的方法来更新小部件。

对于未来的读者:

最好的部分,这适用于窗口小部件的所有实例以及任何上下文(活动,服务等)

inheritance人的代码,

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

礼貌 – 坚持:)

我不想从您的活动中进行调用,而是优先向窗口小部件发送广泛的转换请求以进行更新。 将触发onUpdate方法并传递所有窗口小部件布局。

这是我的代码如下:

1-从活动中发送广播:

 Intent intent = new Intent(ctxt, MyAppWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); int[] ids = {R.layout.appwidget}; intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); ctxt.sendBroadcast(intent); 

现在,2-实现onUpdate方法:

 Intent i = new Intent(ctxt, Settings.class); PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0); for (int widgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId); remoteViews.setTextViewText(R.id.statusMsg, msg); remoteViews.setOnClickPendingIntent(R.id.rootView, pi); AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt); ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class); mngr.updateAppWidget(wdgt, remoteViews); } 

这就对了! 我希望它可以帮助你:)