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
?
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
Voir réponse ci-dessous pourquoi il est préférable d'utiliser PendingIntent.FLAG_UPDATE_CURRENT
.
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;
}
}
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.
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");
}