PendingIntent n’envoie pas d’extras d’intention

Mon MainActicity démarre RefreshService avec un Intent qui a un extra boolean appelé isNextWeek .

My RefreshService émet une Notification qui lance mon MainActivity lorsque l’utilisateur clique dessus.

cela ressemble à ceci:

  Log.d("Refresh", "RefreshService got: isNextWeek: " + Ssortingng.valueOf(isNextWeek)); Intent notificationIntent = new Intent(this, MainActivity.class); notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek); Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + Ssortingng.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, la notificationIntent doit avoir le boolean supplémentaire IS_NEXT_WEEK avec la valeur de isNextWeek qui est placée dans le PendingIntent .

Lorsque je clique maintenant sur cette Notification je reçois toujours la valeur isNextWeek de isNextWeek

C’est comme ça que j’obtiens la valeur dans 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 

Lorsque je lance directement MainActivity avec un Intent avec le paramètre «NextNalValue» comme ceci:

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

tout fonctionne bien et je suis true quand isNextWeek est true .

Qu’est-ce que je me trompe qu’il y a toujours une false valeur?

METTRE À JOUR

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

Citation:

Mon soupçon est que, puisque la seule chose qui change dans Intent est les extras, la méthode de fabrique PendingIntent.getActivity(...) est simplement en train de réutiliser l’ancienne intention en tant qu’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

Je pense que vous devez mettre à jour l’ Intent lorsque vous en recevez une nouvelle en 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); } 

Modifier:

Ceci n’est nécessaire que si votre activité a déjà été lancée lorsque l’intention est reçue. Si votre activité est lancée (et pas seulement reprise) par l’intention, alors le problème est ailleurs et ma suggestion risque de ne pas pouvoir être résolue.

Utiliser PendingIntent.FLAG_CANCEL_CURRENT n’est pas une bonne solution en raison d’une utilisation inefficace de la mémoire. Au lieu de cela, utilisez PendingIntent.FLAG_UPDATE_CURRENT .

Utilisez également Intent.FLAG_ACTIVITY_SINGLE_TOP (l’activité ne sera pas lancée si elle s’exécute déjà en haut de la stack d’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 ); 

Alors:

 @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 ne vous attendez toujours pas à un comportement, essayez d’implémenter le gestionnaire d’événement void onNewIntent(Intent intent) , de cette manière, vous pouvez accéder à la nouvelle intention appelée pour l’activité (ce n’est pas la même chose qu’appeler getIntent () renvoyez 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; } } 

Le code suivant devrait fonctionner: –

 int icon = R.drawable.icon; Ssortingng 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"); }