我有一个WidgetProvider和一个Configure Activity
当Widget启动时,它从configure活动开始,我通过对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传递给函数....在widget中我创建了一个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
答案 0 :(得分:50)
我有类似的问题。只需将此添加到您的配置活动中,您可以在其中设置PendingIntent:
Uri data = Uri.withAppendedPath(
Uri.parse(URI_SCHEME + "://widget/id/")
,String.valueOf(appWidgetId));
intent.setData(data);
变量URI_SCHEME是一个String,可以是你想要的任何东西..即 - “ABCD”这会导致每个小部件都有一个唯一的PendingIntent。
答案 1 :(得分:37)
这里有一个更深入的解释,说明为什么您的代码不起作用以及如何解决它。来自Android SDK文档:
PendingIntent本身只是对由其维护的令牌的引用 系统描述用于检索它的原始数据。这个 意味着,即使它拥有的应用程序的进程被杀死了 PendingIntent本身将继续可用于其他进程 得到了它。如果创建应用程序稍后重新检索相同的内容 一种PendingIntent(相同的操作,相同的Intent动作,数据, 它会收到一个类别和组件,以及相同的标志 PendingIntent表示相同的标记,如果它仍然有效,和 因此可以调用cancel()来删除它。
由于这种行为,了解两个Intent的时间非常重要 为了检索PendingIntent而被认为是相同的。 人们常犯的一个错误就是创建了多个PendingIntent 具有仅在“额外”内容中变化的Intent的对象, 期望每次获得不同的PendingIntent。事实并非如此 发生。用于匹配的Intent部分是 由Intent.filterEquals定义的相同内容。如果你使用两个Intent 根据Intent.filterEquals等效的对象,那么你会 为他们两个获得相同的PendingIntent。
请注意,指定不同的“额外”内容不足以将PendingIntents视为唯一,但使用setData设置唯一URI。这就是为什么Snailer的URI解决方案“神奇地”解决了这个问题。
该文档还提供了一个不同的(可以说是更简单的)解决方案。在调用getActivity时,只需设置一个唯一的requestCode,而不是创建自定义URI:
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
来源:http://developer.android.com/reference/android/app/PendingIntent.html
答案 2 :(得分:10)
在我的测试中,在PendingIntent上使用setData(...)并不能解决运行Android 4.0.4的Verizon Thunderbolt上的问题。它适用于我的其他测试设备和模拟器。
我测试了requestCode的使用,它适用于所有情况。我只是将requestCode设置为小部件ID:
pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);