如何避免缓存的待处理意图?

3
给定两个相同的小部件,具有不同的数据A和B,当在widget A启动的活动中显示widget A的数据时,按下返回按钮,然后按下widget B,一切正常。 但是,当显示widget A的数据时,按下主页按钮,然后按下widget B,仍会显示widget A的数据。从Android-当使用不同的extras从小部件启动相同的活动时,如何防止从HOME按钮返回后显示相同的实例?建议我的问题是两个PendingIntents(对于小部件A和B)是相同的,只有extras不同,因此被缓存。也就是说,在extras中是小部件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());

所有的努力都没有效果。

你尝试过将PendingIntent.getActivity的最后一个参数从0更改为FLAG_UPDATE_CURRENT吗? - Ian G. Clifton
@Ian,也许我还不够理解,但是这样做不会覆盖其他类似小部件的待处理意图(pendingIntents)附加项吗?也就是说,本质上会做我试图避免的事情?无论如何,这并没有解决我的问题。 - Chris Knight
它将覆盖任何匹配的PendingIntent。您的操作应该包括您的包名称加上某种“操作”字符串以及小部件ID。这样,如果给定小部件的PendingIntent更新,它将更新该小部件的现有PendingIntent。 - Ian G. Clifton
2个回答

5

请尝试同时使用以下两种方法:

  1. 用不同的操作字符串设置待定意图 - intent.setAction("actionstring" + System.currentTimeMillis());
  2. 设置正确的标志 - 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
谢谢,但不幸的是这对我没有用。这些东西需要进行任何清单更改吗? - Chris Knight
1
很抱歉,对我来说还是不起作用。无论如何,感谢您的回答。 - Chris Knight

3

终于(!)找到了我一直在寻找的答案,而且它就像我希望的那样简单。PendingIntents被正确地设置和传递。然而,我没有明确地对新意图做任何事情。当按下主页按钮时,活动会保留启动它的原始意图。我所需要做的就是在我的Activity中用这个新的意图覆盖它:

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    super.onNewIntent(intent);
}

然后,其余的生命周期被启动(包括 onResume(),在这个方法中我的 Activity 大部分处理发生)使用新的 intent,而不是原始的 intent。


这对我有用!不需要像其他帖子所说的那样为Intent设置不同的Data或Action,甚至设置FLAG_xxxxxxx参数。 - Miguel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接