仅Widget的多个实例更新最后一个小部件

我有一个WidgetProvider和一个configuration活动

当Widget启动时,它将从configuration活动开始,并通过对WidgetProvider的自定义调用进行设置

(你会注意到这是从SDK教程的例子)

// Push widget update to surface with newly set prefix AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AwarenessWidget.updateAppWidget(context, appWidgetManager, mAppWidgetId, position); // Make sure we pass back the original appWidgetId Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish(); 

我将Widget ID传递给小部件中的函数….我创build一个Intent像这样:

  Intent configIntent = new Intent(context, Configure.class); configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.MainImage,pendingIntent); views.setImageViewResource(R.id.MainImage, lv_images[version]); appWidgetManager.updateAppWidget(appWidgetId, views); 

我总是引用小部件ID,甚至把它作为额外的意图添加,但是当我在主屏幕上获得这些小部件中的两个时,小部件ID总是引用最后放置的小部件ID

我有一个类似的问题。 只需将其添加到您的configuration活动中,在其中设置您的PendingIntent:

 Uri data = Uri.withAppendedPath( Uri.parse(URI_SCHEME + "://widget/id/") ,String.valueOf(appWidgetId)); intent.setData(data); 

variablesURI_SCHEME是一个string,可以是任何你想要的。即 – “ABCD”这使每个小部件有一个独特的PendingIntent。

这里是更深入的解释为什么你的代码不工作,以及如何解决它。 从Android SDK文档:

PendingIntent本身就是对由系统维护的令牌的简单描述,该令牌用于检索原始数据。 这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身仍然可以从其他被赋予的进程中使用。 如果稍后创build的应用程序重新获取相同types的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件,以及相同的标志),则它将接收到表示同一标记的PendingIntent(如果该标识仍然有效)因此调用cancel()将其删除。

由于这种行为,为了检索PendingIntent,知道何时两个Intents被认为是相同的是很重要的。 人们犯的一个常见错误是创build多个PenttentIntent对象,其Intents只在其“额外”内容上有所不同,期望每次都得到不同的PendingIntent。 这不会发生。 用于匹配的Intent部分与Intent.filterEquals定义的部分相同。 如果您使用两个与Intent.filterEquals等效的Intent对象,那么您将为它们获得相同的PendingIntent。

请注意,指定不同的“额外”内容对于PendingIntents被认为是唯一的,但是用setData设置唯一的URI是不够的。 这就是为什么Snailer的URI解决scheme“神奇地”修复了这个问题。

文档还提供了一个不同的(可以说更简单的)解决scheme。 调用getActivity时,不要创build自定义URI,而只需设置唯一的requestCode:

 PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

资料来源: http : //developer.android.com/reference/android/app/PendingIntent.html

在我的testing中,在PendingIntent上使用setData(…)并不能解决运行Android 4.0.4的Verizon Thunderbolt问题。 它适用于我的其他testing设备和仿真器。

我testing了requestCode的使用,而且它在所有情况下都能正常工作。 我只是将requestCode设置为小部件ID:

 pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);