2010-10-25 43 views
18

我有一个WidgetProvider和配置活动多个实例的Widget只更新最新插件

当小部件启动其与配置活动的开始,我把它通过使一个自定义调用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(); 

我通过微件ID的函数....微件内我创建这样的意图:

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,甚至将其添加为一个额外的意图 但是当我得到两个这些小部件的主屏幕小部件I​​D始终引用最后放置控件ID

回答

49

上我有类似的问题。只需添加到您的配置活动,在这里您设置的PendingIntent:

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

变量URI_SCHEME是一个字符串,可以是你想什么..即 - “ABCD”这将导致每个插件有独特的PendingIntent。

+0

我没有设置的PendingIntent在我的配置活动,只有在该活动呼吁 – morty346 2010-10-25 02:25:55

+0

OK,只是出于它在我的小部件功能部件的功能和它工作 – morty346 2010-10-25 02:32:19

+2

+1尼斯破解:) – 2011-06-10 08:54:44

36

下面是关于为什么你的代码不起作用以及如何解决它的更深入的解释。从Android SDK文档:

甲的PendingIntent本身是简单地通过 描述用于检索它的原始数据的系统所维护的令牌的引用。这个 意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身仍然可以从其他进程中获得 。如果稍后创建的应用程序重新获取PendingIntent(相同的操作,相同的意图操作,数据, 类别和组件以及相同的标志)相同的 PendingIntent,它将收到代表相同标记的PendingIntent(如果该标识仍然有效) ,并且 可以因此调用cancel()来移除它。

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

请注意,指定不同的“额外”内容不足以让PendingIntents被视为唯一的,但是使用setData设置唯一的URI是。这就是为什么Snailer的URI解决方案“神奇地”修复了这个问题。

该文档还提供了一种不同的(可以说更简单的)解决方案。而不是创建一个自定义的URI只是设置一个唯一的requestCode当你调用getActivity的:

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

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

+0

从SDK中,似乎requestCode目前未被使用... – ken 2013-01-25 02:24:00

+1

requestCode目前未被SDK使用,但它确实导致Intent被认为是唯一的。该文档建议这是requestCode的有效使用:“或提供给getActivity的不同请求代码整数” – 2013-01-25 21:09:36

+0

真棒,非常有用 – Dima 2016-08-29 00:09:51

10

在我的测试,使用上的PendingIntent使用setData(...)没有解决在运行Android 4.0.4的Verizon Thunderbolt上出现问题。它适用于我的其他测试设备和仿真器。

我测试了requestCode的用法,而且它适用于所有情况。我刚才设置的requestCode是控件ID:

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

伟大的解决方案。需要数小时才能找到。非常感谢。 – 2014-01-14 13:27:12