95 votes

PendingIntent fonctionne correctement pour la première notification mais incorrectement pour le reste

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

    Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
    notification.setLatestEventInfo(context, "Upload", response, pendingIntent);

    nManager.notify((int)System.currentTimeMillis(), notification);
}

Cette fonction sera appelée plusieurs fois. Je voudrais que pour chaque notification pour lancer testActivity lorsqu'on clique dessus. Malheureusement, seule la première notification lance testActivity. En cliquant sur les autres, la fenêtre de notification est réduite.

Informations supplémentaires : Fonction displayNotification() est dans une classe appelée UploadManager . Context est passé dans UploadManager del activity qui s'instancie. Fonction displayNotification() est appelée plusieurs fois à partir d'une fonction, également dans UploadManager, qui s'exécute dans un fichier AsyncTask .

Edit 1 : J'ai oublié de mentionner que je passe la réponse String dans Intent intent comme un extra .

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    intent.putExtra("response", response);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Cela fait une grande différence car j'ai besoin de la "réponse" supplémentaire pour refléter ce qu'était la réponse de String lorsque la notification a été créée. Au lieu d'utiliser PendingIntent.FLAG_UPDATE_CURRENT le "response" supplémentaire reflète la réponse de String lors du dernier appel à displayNotification() .

Je sais pourquoi c'est le cas en lisant la documentation sur FLAG_UPDATE_CURRENT . Toutefois, je ne sais pas comment contourner ce problème pour le moment.

9voto

Tomasz Points 128

Comme indiqué dans la documentation, utilisez un code de demande unique :

Si vous avez vraiment besoin de plusieurs objets PendingIntent distincts actifs en même temps en même temps (par exemple pour utiliser deux notifications qui s'affichent toutes deux en même temps), vous devrez vous assurer qu'il y ait quelque chose différent pour les associer à des PendingIntents différents. PendingIntents différents. Il peut s'agir de n'importe lequel des attributs d'Intent pris en compte par Intent.filterEquals, ou de différents codes de requête entiers fournis à getActivity(Contexte, int, Intent, int), getActivities(Contexte, int, Intent[], int), getBroadcast(Context, int, Intent, int), ou getService(Contexte, int, Intent, int).

8voto

Jon Shemitz Points 522

Pour info, j'ai eu plus de chance avec PendingIntent.FLAG_CANCEL_CURRENT qu'avec PendingIntent.FLAG_UPDATE_CURRENT .

6voto

Waleed A. Elgalil Points 355

J'ai eu le même problème et je l'ai résolu en suivant les étapes suivantes

1) Effacer tout indicateur d'intention

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

2) insérer intent.setAction par le code suivant

 intent.setAction(Long.toString(System.currentTimeMillis()));

3) pour Pendingintent ,insérer le code suivant

   PendingIntent Pintent = PendingIntent.getActivity(ctx,0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

J'espère pouvoir travailler avec vous

2voto

Dmytro Ubogyi Points 61
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

Dans PendingIntent, il y a deux paramètres int, le deuxième et le dernier. Le second est le "code de la demande" et il doit être un numéro unique (par exemple l'id de votre notification), sinon si (comme dans votre exemple il est égal à zéro, il sera toujours écrasé).

1voto

MIkka Marmik Points 90
// Use pending Intent and  also use unique id for display notification....
// Get a PendingIntent containing the entire back stack
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager mNotificationManager = (NotificationManager)  sqlitewraper.context.getSystemService(Context.NOTIFICATION_SERVICE);
// Issue the notification
mNotificationManager.notify(id, builder.build());

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