Android 小部件挂起意图未更新

Android 小部件挂起意图未更新,android,android-widget,Android,Android Widget,我有一个小部件显示10个图像。单击其中一个图像,它会打开一个活动,显示与该图像对应的一些信息。数据存储在sqlite数据库中 每周,这些图像都会发生变化(这是一个由>100个不同对象组成的池,每周都会显示这些对象的另一个子集) 我的onUpdate方法如下所示: List<Champion> champions = // a list of 10 champions out of 100 fetched from db int[] imageIds = // drawable ids

我有一个小部件显示10个图像。单击其中一个图像,它会打开一个活动,显示与该图像对应的一些信息。数据存储在sqlite数据库中

每周,这些图像都会发生变化(这是一个由>100个不同对象组成的池,每周都会显示这些对象的另一个子集)

我的onUpdate方法如下所示:

List<Champion> champions = // a list of 10 champions out of 100 fetched from db
int[] imageIds = // drawable ids for the 10 champions

// creating the pending intents
PendingIntent[] pIntents = new PendingIntent[champions.size()];
for(int i = 0; i < champions.size(); i++)
{
    Intent intent = new Intent(context, ChampionActivity.class);
    intent.putExtra(ChampionActivity.KEY_ID, champions.get(i).getChampionId());
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    pIntents[i] = PendingIntent.getActivity(context, i, intent, 0);
}

// updating widgets with the new images and intents
for(int widgetId : appWidgetIds)
{
    RemoteViews view = new RemoteViews(
                          context.getPackageName(),
                          R.layout.widget
                       );
    for(int i = 0; i < imageViewIds.length; i++)
    {
        view.setImageViewResource(imageViewIds[i], imageIds[i]);
        view.setOnClickPendingIntent(imageViewIds[i], pIntents[i]);
    }
    appWidgetManager.updateAppWidget(widgetId, view);
}
List champions=//从db获取的100个冠军中有10个冠军的列表
int[]imageIds=//10个冠军的可绘制ID
//创建挂起的意图
Pending帐篷[]pIntents=新的Pending帐篷[champions.size()];
对于(int i=0;i
此小部件设置为每30分钟更新一次。图像的更新工作正常,但不知何故,挂起的意图似乎没有得到更新

示例:
-当显示champion A时,用户将小部件添加到主屏幕。
-30分钟后,冠军A替换为冠军B,图像相应更新
-点击champion B仍然会让用户找到champion A(intent extra是A的id,而不是id ob B)

我做错了什么?

提前感谢

这是一个常见错误,即您的问题在这一行:

pIntents[i] = PendingIntent.getActivity(context, i, intent, 0);
具体来说,问题在于:它在小部件的生命周期中是恒定的。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的(即第一个)
待决内容
。如果您希望交付新的
Intent
,则需要使用新的请求代码。从:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

champions.get(i).getChampionId()的返回值类型是什么?如果这是一个
int
,那么它看起来很适合用作请求代码。所以,使用

pIntents[i] = PendingIntent.getActivity(context, champions.get(i).getChampionId(), intent, 0);
可能会解决这个问题


希望这有帮助。

这是一个常见错误,即您的问题在这一行:

pIntents[i] = PendingIntent.getActivity(context, i, intent, 0);
具体来说,问题在于:它在小部件的生命周期中是恒定的。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的(即第一个)
待决内容
。如果您希望交付新的
Intent
,则需要使用新的请求代码。从:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

champions.get(i).getChampionId()的返回值类型是什么?如果这是一个
int
,那么它看起来很适合用作请求代码。所以,使用

pIntents[i] = PendingIntent.getActivity(context, champions.get(i).getChampionId(), intent, 0);
可能会解决这个问题


希望这有帮助。

为了更新PendingEvent中的额外数据(如果它已经存在),您可以使用flag。因为一次只需要激活一个挂起的意图,所以它更合适。记住传递相同的请求代码。请求代码可以是
appWidgetId
,以便在多个实例的情况下使其唯一。[感谢@shoerat指出了这个问题]。从:

指示所述挂起内容是否已存在的标志, 然后保留它,但用新文件中的内容替换它的额外数据 意图用于getActivity(Context、int、Intent、int), getBroadcast(Context,int,Intent,int)和getService(Context,int, 意图,int)

如果您正在创建仅包含额外内容的意图,则可以使用此选项 更改,并且不关心收到您以前的 PendingEvent将能够与您的新附加功能一起启动,即使 它们并没有明确地给予它

代码如下:

Intent intent = new Intent(context, ChampionActivity.class);
intent.putExtra("widgetId", appWidgetId);
pIntents[i] = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

为了更新PendingEvent中已经存在的额外数据,可以使用flag。因为一次只需要激活一个挂起的意图,所以它更合适。记住传递相同的请求代码。请求代码可以是
appWidgetId
,以便在多个实例的情况下使其唯一。[感谢@shoerat指出了这个问题]。从:

指示所述挂起内容是否已存在的标志, 然后保留它,但用新文件中的内容替换它的额外数据 意图用于getActivity(Context、int、Intent、int), getBroadcast(Context,int,Intent,int)和getService(Context,int, 意图,int)

这可能是