Mon MainActicity
commence RefreshService
par un Intent
qui a un boolean
extra appelé isNextWeek
.
My RefreshService
crée un Notification
qui démarre my 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
supplément IS_NEXT_WEEK
dont la valeur isNextWeek
est placée dans le fichier PendingIntent
.
Quand je clique maintenant, Notification
je reçois toujours false
comme valeur deisNextWeek
C'est ainsi que j'obtiens la valeur dans MainActivity
:
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
Journal:
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 démarre 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 je reçois true
quand isNextWeek
est true
.
Qu'est-ce que je fais de mal qu'il y ait toujours une false
valeur?
METTRE À JOUR
cela résout le problème: https://stackoverflow.com/a/18049676/2180161
Citation:
Je soupçonne que, puisque la seule chose qui change dans l'intention est les extras, la
PendingIntent.getActivity(...)
méthode d'usine 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 la réponse ci-dessous pourquoi il est préférable d'utiliser PendingIntent.FLAG_UPDATE_CURRENT
.
Réponses:
L'utilisation de PendingIntent.FLAG_CANCEL_CURRENT n'est pas une bonne solution en raison d'une utilisation inefficace de la mémoire. Utilisez plutôt 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 d'historique).
Ensuite:
Cela devrait fonctionner maintenant.
Si vous n'avez toujours pas de comportement attendu, essayez d'implémenter le
void onNewIntent(Intent intent)
gestionnaire d'événements, de cette façon vous pouvez accéder au nouvel intent qui a été appelé pour l'activité (ce qui n'est pas la même chose que d'appeler simplement getIntent (), cela retournera toujours le premier Intent qui a été lancé votre activité.la source
Je pense que vous devez mettre à jour le
Intent
lorsque vous en recevez un nouveau en remplaçantonNewIntent(Intent)
votre activité. Ajoutez ce qui suit à votre activité:Éditer:
Cela n'est nécessaire que si votre activité a déjà été démarrée lorsque l'intention est reçue. Si votre activité est démarrée (et pas simplement reprise) par l'intention, alors le problème est ailleurs et ma suggestion ne peut pas le résoudre.
la source
Le code suivant devrait fonctionner: -
Dans MainActivity onCreate:
la source
new Notification(icon, message, when);
est obsolète