给定两个具有不同数据A和B的相同小部件,当小部件A的数据显示在小部件启动的活动中时,按下后退按钮,然后按下小部件B,一切正常。然而,当显示小部件A的数据时,按下主页按钮然后按下小部件B,仍然显示小部件A的数据。从Android - When launch the same activity from widget with different extras, how to prevent the same instance show up after returned from HOME button?开始,它表明我的问题是PendingIntents
(对于小部件A和B)都是相同的,并且仅在附加内容上有所不同,因此被缓存。即在附加项中是小部件ID,这是我需要检索小部件按下操作的所有数据的密钥。一个建议是使用不同的数据,但我似乎无法让这个工作。这是代码:
Intent intent = new Intent(context, WidgetActivity.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setData(Uri.withAppendedPath(Uri.parse("droidln://widget/id/"),
String.valueOf(appWidgetId)));
PendingIntent pendingIntent =
PendingIntent.getActivity(context, appWidgetId, intent, 0);
将setData
添加到意图中没有产生任何差异。关于如何解决缓存挂起意图问题的任何想法?我也试过了:
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
和
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
和
intent.setAction("actionstring" + System.currentTimeMillis());
一切都没有效果。
答案 0 :(得分:5)
尝试同时使用:
intent.setAction("actionstring" + System.currentTimeMillis());
PendingIntent.FLAG_UPDATE_CURRENT
(针对您的情况:PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
我在许多应用程序中使用这种PendingIntent
样式,事实证明它是正确的。
我一直在使用的示例代码:
final ComponentName receiverName = new ComponentName(context, WidgetProvider.class);
Intent doSth = new Intent("REFRESH_ME" + System.currentTimeMillis());
doSth.setComponent(receiverName);
doSth.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
PendingIntent doSthPending = PendingIntent.getBroadcast(context, 0, doSth, PendingIntent.FLAG_UPDATE_CURRENT);
答案 1 :(得分:2)
最后(!)找到了我正在寻找的答案,它就像我希望的那样简单。 PendingIntents正在设置并正确传递。但是,我没有明确地对新意图做任何事情。按下主页按钮时,活动将保留启动它的原始意图。我需要做的就是在我的Activity中用新的意图覆盖它:
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
super.onNewIntent(intent);
}
然后,生命周期的其余部分将使用新的intent而不是原始的intent启动(包括onResume()
我的Activity中的大部分处理)。