web-dev-qa-db-fra.com

PendingIntent n'envoie pas de suppléments d'intention

Mon MainActicity démarre RefreshService avec un Intent doté d'un extra boolean appelé isNextWeek.

Mon RefreshService crée un Notification qui commence mon MainActivity lorsque l'utilisateur clique dessus.

cela ressemble à ceci:

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

Comme vous pouvez le voir, le notificationIntent devrait avoir le boolean extra IS_NEXT_WEEK Avec la valeur de isNextWeek qui est placé dans le PendingIntent.

Quand je clique maintenant sur ce Notification, je reçois toujours false comme valeur de isNextWeek

Voici comment j'obtiens la valeur dans le MainActivity:

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

Bûche:

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

Quand je lance directement le MainActivity avec un Intent avec le ìsNextValue` comme ceci:

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

tout fonctionne bien et j'obtiens true lorsque isNextWeek est true.

Qu'est-ce que je fais comme il est faux qu'il y a toujours une valeur false?

MISE À JOUR

cela résout le problème: https://stackoverflow.com/a/18049676/2180161

Citation:

Je soupçonne que, puisque les extras ne changent que dans l’intention, la méthode de fabrique PendingIntent.getActivity(...) consiste simplement à réutiliser l’ancienne intention comme une optimisation.

Dans RefreshService, essayez:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Voir:

http://developer.Android.com/reference/Android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

MISE À JOUR 2

Voir réponse ci-dessous pourquoi il est préférable d'utiliser PendingIntent.FLAG_UPDATE_CURRENT.

115
maysi

L'utilisation de PendingIntent.FLAG_CANCEL_CURRENT n'est pas une bonne solution en raison d'une utilisation inefficace de la mémoire. À la place, utilisez PendingIntent.FLAG_UPDATE_CURRENT.

Utilisez également Intent.FLAG_ACTIVITY_SINGLE_TOP (l'activité ne sera pas lancée si elle est déjà en cours d'exécution en haut de la pile de l'historique) .

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

Ensuite:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

Cela devrait fonctionner maintenant.


Si vous n'avez toujours pas le comportement attendu, essayez d'implémenter le gestionnaire d'événements void onNewIntent(Intent intent). Ainsi, vous pourrez accéder à la nouvelle intention appelée pour l'activité (ce qui n'est pas la même chose que d'appeler simplement getIntent (), cela renvoie toujours la première intention qui a lancé votre activité.

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}
20
Yuliia Ashomok

Je pense que vous devez mettre à jour le Intent lorsque vous en recevez un nouveau en remplaçant onNewIntent(Intent) dans votre activité. Ajoutez ce qui suit à votre activité:

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

Edit:

Cela n'est nécessaire que si votre activité a déjà été commencée lorsque l'intention est reçue. Si votre activité est commencée (et pas simplement reprise) par l'intention, alors le problème est ailleurs et ma suggestion peut ne pas résoudre le problème.

19
Vikram

Le code suivant devrait fonctionner: -

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

Dans MainActivity onCreate:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}
3
Haris ur Rehman