J'ai un récepteur d'alarme qui effectue certaines vérifications, puis crée une Notification
pour chaque vérification. Cela signifie qu'il peut créer plus d'une Notification
. Tout cela fonctionne bien. Cependant, j'ai un Intent
connecté à la notification pour démarrer une activité lorsque la notification est appuyée.
Voici le code de notification:
private PendingIntent getPendingIntent(SolarEdge solarEdge, int reason) { String apikey = solarEdge.getApikey(); int installationId = solarEdge.getInfo().getId(); Intent intent = new Intent(context, InstallationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(EXTRA_API_KEY, apikey); intent.putExtra(EXTRA_INSTALLATION_ID, installationId); intent.putExtra(EXTRA_REASON, reason); return PendingIntent.getActivity(context, 0, intent, 0); }
La méthode qui crée le PendingIntent
est:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_OUTPUT_LEVELS) .setSmallIcon(icon) .setContentTitle(title) .setContentText(message) .setStyle(new NotificationCompat.BigTextStyle() .bigText(longmessage)) .setContentIntent(getPendingIntent(solarEdge, reason)) .setAutoCancel(true) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); // notificationId is a unique int for each notification that you must define // we use the installation's ID to make sure all notifications get sent notificationManager.notify(solarEdge.getInfo().getId(), mBuilder.build());
Le problème que j'ai, c'est que même si je crée une intention différente, elle appelle toujours le Activité avec les mêmes extras (apikey et installid). Il faut toujours le premier créé.
3 Réponses :
Il semble que le problème soit causé par les arguments que vous avez transmis à la méthode getActivity
.
Essayez le code suivant
PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);
Le le deuxième argument est requestCode
, il doit donc être unique.
@BartFriederichs vous êtes les bienvenus, les documents ne contiennent parfois pas d'informations importantes.
@BartFriederichs, étant un code de requête, cela implique qu'il devrait être unique pour cette requête, mais je suis tombé pour lui aussi.
Pour obtenir un PendingIntent
unique à chaque appel, l'appel à PendingIntent.getActivity ()
doit fournir soit un requestCode ou < / b> un Intent
unique. Pour rendre l ' intention
unique, il est nécessaire de fournir soit une ACTION, des DONNÉES ou un COMPOSANT unique. Il existe donc plusieurs manières de résoudre ce problème.
"Problème" / bizarrerie / design connu et nous, les programmeurs, continuons à le rencontrer. Le paramètre de code de requête doit être différent de 0 si l'intention est la même (action, données ou composant identiques, pas seulement les données supplémentaires diffèrent).
requestCode = 1 for the content intent. requestCode = 2 for first action requestCode = 3 for second action etc
De plus:
Si vous souhaitez mettre à jour une notification / intention en attente plus tard, vous pouvez utiliser le même code de demande.
Si vous ajoutez plusieurs intentions en attente, elles doivent toutes être différentes. Exemple: une action d'arrêt et une action de pause.
Je suis généralement ce modèle:
int requestCode = 1; PendingIntent.getActivity(context, requestCode, intent, 0);
Il doit en fait être unique par appel. Si je mets seulement 1, cela ne fonctionne toujours pas correctement.
Pas par appel, mais par intention que vous souhaitez ajouter. Si vous souhaitez le mettre à jour plus tard, par exemple en changeant un intent "play" en un intent "pause", vous utilisez le même.
C'est tout simplement faux. Le code de demande n'a pas besoin d'être différent de zéro. Pour obtenir un PendingIntent
unique à chaque appel, l'appel à PendingIntent.getActivity ()
doit fournir soit un requestCode ou < / b> un Intent
unique. Pour rendre l ' intention
unique, il est nécessaire de fournir soit une ACTION, des DONNÉES ou un COMPOSANT unique. Il existe donc plusieurs manières de résoudre ce problème, mais changer le requestCode en "1" n'en fait pas partie.
Oh oui tout à fait d'accord sur le fait que vous pouvez également rendre l'intention unique comme vous le dites.
La réponse acceptée est une façon de résoudre le problème, mais ce n'est pas la seule.
Pour obtenir un PendingIntent
unique à chaque appel, l'appel à PendingIntent.getActivity ()
doit fournir soit un unique requestCode
ou un Intent
unique. Pour rendre le Intent
unique, il est nécessaire de fournir soit une ACTION, des DONNÉES ou un COMPOSANT unique. Il existe donc plusieurs manières de résoudre ce problème.