2
votes

L'intention dans la notification ne change pas

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éé.


0 commentaires

3 Réponses :


9
votes

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.


3 commentaires

@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.



0
votes

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


4 commentaires

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.



1
votes

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.


0 commentaires