3 votes

Comment éviter les intents en attente de mise en cache ?

Étant donné deux widgets identiques avec des données différentes, A et B, lorsque les données du widget A sont affichées dans l'activité lancée par le widget, que l'on appuie sur le bouton retour et que l'on appuie ensuite sur le widget B, tout fonctionne bien. Cependant, lorsque les données du widget A sont affichées, que l'on appuie sur le bouton d'accueil, puis sur le widget B, les données du widget A sont toujours affichées. À partir de Android - Lorsque l'on lance la même activité à partir d'un widget avec différents extras, comment éviter que la même instance apparaisse après le retour du bouton HOME ? cela suggère que mon problème est que les deux PendingIntents (pour les widgets A et B) sont les mêmes et ne diffèrent que par les extras et sont donc mis en cache. C'est-à-dire que dans les extras se trouve l'id du widget qui est la clé dont j'ai besoin pour récupérer toutes les données pour l'action widget-press. Une suggestion était d'utiliser des données différentes, mais je n'arrive pas à faire fonctionner cette solution. Voici le code :

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);

Ajout de la setData à l'intention n'a produit aucune différence. Avez-vous des idées sur la manière de résoudre le problème des intentions en attente de mise en cache ? J'ai également essayé :

intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

et

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

et

intent.setAction("actionstring" + System.currentTimeMillis());

sans aucun effet.

5voto

Kocus Points 1162

Essayez d'utiliser les deux :

  1. Des actions différentes pour des intentions différentes - intent.setAction("actionstring" + System.currentTimeMillis());
  2. Drapeau approprié - PendingIntent.FLAG_UPDATE_CURRENT (pour votre cas : PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

J'utilise ceci PendingIntent dans de nombreuses applications et il s'est avéré être le bon.

L'exemple de code que j'ai utilisé :

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X