dan*_*joo 0 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 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);
}
Run Code Online (Sandbox Code Playgroud)
该小部件设置为每30分钟更新一次。图像的更新工作正常,但是以某种方式似乎未更新暂挂的意图。
示例:
-当显示冠军A时,用户将小部件添加到其主屏幕。
-30分钟后,将冠军A替换为冠军B,图像也会相应更新
-单击冠军B仍会引导用户进入冠军A(意图是ID为A,而不是ob B)
我究竟做错了什么?
提前致谢
为了更新已经存在的 PendingIntent 中的额外数据,您可以使用PendingIntent.FLAG_UPDATE_CURRENT标志。由于您一次只需要一个未决的意图处于活动状态,因此更合适。请记住传递相同的请求代码。请求代码可以是appWidgetId在多个实例的情况下使其唯一。[感谢@shoerat 指出问题]。从文档:
指示如果描述的 PendingIntent 已经存在,则保留它,但用这个新 Intent 中的内容替换它的额外数据。与 getActivity(Context, int, Intent, int)、getBroadcast(Context, int, Intent, int) 和 getService(Context, int, Intent, int) 一起使用。
如果您正在创建仅附加内容发生变化的意图,并且不关心收到您之前的 PendingIntent 的任何实体将能够使用您的新附加内容启动它,即使它们没有明确提供给它,这可以使用。
这是代码:
Intent intent = new Intent(context, ChampionActivity.class);
intent.putExtra("widgetId", appWidgetId);
pIntents[i] = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)
这是一个常见的错误,即您的问题在以下一行:
pIntents[i] = PendingIntent.getActivity(context, i, intent, 0);
Run Code Online (Sandbox Code Playgroud)
具体来说,问题在于requestCode:在小部件的生命周期中它是恒定的。因此,平台无法将新的识别Intent为“新的”,并且将PendingIntent始终提供相同的(即第一个)。如果要Intent交付新的请求代码,则需要使用新的请求代码。从文档:
...重要的是要知道两个Intent在检索PendingIntent时是否相同。人们经常犯的一个错误是创建多个PendingIntent对象,它们的Intent仅在其“额外”内容中有所不同,期望每次都获得一个不同的PendingIntent。这不会发生。Intent中用于匹配的部分与Intent.filterEquals定义的部分相同。如果您使用与Intent.filterEquals等效的两个Intent对象,则它们将获得相同的PendingIntent。
返回值的类型是champions.get(i).getChampionId()什么?如果是,则看起来很适合用作请求代码int。因此,使用
pIntents[i] = PendingIntent.getActivity(context, champions.get(i).getChampionId(), intent, 0);
Run Code Online (Sandbox Code Playgroud)
可能会解决问题。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |