Как избежать кеширования ожидающих намерений? - PullRequest
3 голосов
/ 01 ноября 2011

При наличии двух идентичных виджетов с разными данными, A и B, когда данные для виджета A отображаются в активности, запущенной виджетом, нажимается кнопка «Назад», а затем - виджет B, все работает нормально.Однако, когда отображаются данные для виджета A, нажимается кнопка «Домой», а затем - виджет B, данные для виджета A по-прежнему отображаются.От Android - при запуске одного и того же действия из виджета с различными дополнительными функциями, как предотвратить появление одного и того же экземпляра после возврата из кнопки HOME? предполагает, что моя проблема в том, что оба PendingIntents (для виджетов A иБ) одинаковы и отличаются только дополнениями и поэтому кэшируются.Т.е. в дополнениях есть идентификатор виджета, который является ключом, который мне нужен, чтобы получить все данные для действия виджета-нажатия.Одним из предложений было использование разных данных, но я не могу заставить это работать.Вот код:

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 ]

5 голосов
/ 01 ноября 2011

Попробуйте использовать оба из:

  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);
2 голосов
/ 01 ноября 2011

Наконец (!) Нашел ответ, который я искал, и это было так просто, как я надеялся. PendingIntents были настроены и переданы правильно. Однако я явно ничего не делал с новым намерением. Когда кнопка «Домой» нажата, действие сохраняет первоначальное намерение, которое его запустило. Все, что мне нужно было сделать, это переписать это с новым намерением, как это в моей Деятельности:

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

Затем запускается остальная часть жизненного цикла (включая onResume(), где происходит большая часть обработки в моей Деятельности) с использованием нового намерения вместо исходного.

...