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

时间:2010-10-25 00:27:49

标签: android android-widget

我有一个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

3 个答案:

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