Android 小部件挂起意图未更新
我有一个小部件显示10个图像。单击其中一个图像,它会打开一个活动,显示与该图像对应的一些信息。数据存储在sqlite数据库中 每周,这些图像都会发生变化(这是一个由>100个不同对象组成的池,每周都会显示这些对象的另一个子集) 我的onUpdate方法如下所示: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
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)
这可能是