如何避免缓存挂起的意图?

时间:2011-10-31 22:33:02

标签: android caching android-pendingintent

给定两个具有不同数据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());

一切都没有效果。

2 个答案:

答案 0 :(得分:5)

尝试同时使用:

  1. 待处理意图的不同操作 - intent.setAction("actionstring" + System.currentTimeMillis());
  2. 正确的旗帜 - PendingIntent.FLAG_UPDATE_CURRENT(针对您的情况:PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  3. 我在许多应用程序中使用这种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中的大部分处理)。