Mein MainActicity
beginnt RefreshService
mit einem, Intent
der ein boolean
Extra genannt hat isNextWeek
.
Mein RefreshService
macht ein, Notification
das mein startet, MainActivity
wenn der Benutzer darauf klickt.
das sieht so aus:
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);
Wie Sie sehen können, notificationIntent
sollte das das boolean
Extra haben, IS_NEXT_WEEK
dessen Wert in isNextWeek
das eingegeben wird PendingIntent
.
Wenn ich jetzt darauf Notification
klicke, bekomme ich immer den false
Wert vonisNextWeek
Auf diese Weise erhalte ich den Wert in MainActivity
:
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
Log:
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
Wenn ich das direkt MainActivity
mit einem Intent
mit dem "sNextValue" wie folgt beginne:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
alles funktioniert gut und ich bekomme true
wann isNextWeek
ist true
.
Was mache ich falsch, dass es immer einen false
Wert gibt?
AKTUALISIEREN
Dies löst das Problem: https://stackoverflow.com/a/18049676/2180161
Zitat:
Mein Verdacht ist, dass, da sich in der Absicht nur die Extras ändern, die
PendingIntent.getActivity(...)
Factory-Methode einfach die alte Absicht als Optimierung wiederverwendet.Versuchen Sie in RefreshService:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Sehen:
http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
UPDATE 2
Siehe Antwort unten, warum es besser ist, zu verwenden PendingIntent.FLAG_UPDATE_CURRENT
.
Antworten:
Die Verwendung von PendingIntent.FLAG_CANCEL_CURRENT ist aufgrund der ineffizienten Speichernutzung keine gute Lösung. Verwenden Sie stattdessen PendingIntent.FLAG_UPDATE_CURRENT .
Verwenden Sie auch Intent.FLAG_ACTIVITY_SINGLE_TOP (die Aktivität wird nicht gestartet, wenn sie bereits oben im Verlaufsstapel ausgeführt wird).
Dann:
Es sollte jetzt funktionieren.
Wenn Sie immer noch kein erwartetes Verhalten haben, versuchen Sie, die
void onNewIntent(Intent intent)
Ereignisbehandlungsroutine zu implementieren . Auf diese Weise können Sie auf die neue Absicht zugreifen, die für die Aktivität aufgerufen wurde (was nicht mit dem Aufruf von getIntent () identisch ist). Dies gibt immer die erste Absicht zurück, die gestartet wurde Ihre Aktivität.quelle
Ich denke, Sie müssen das aktualisieren,
Intent
wenn Sie ein neues erhalten, indem SieonNewIntent(Intent)
Ihre Aktivität überschreiben . Fügen Sie Ihrer Aktivität Folgendes hinzu:Bearbeiten:
Dies ist nur erforderlich, wenn Ihre Aktivität bereits gestartet wurde, als die Absicht empfangen wurde. Wenn Ihre Aktivität durch die Absicht gestartet (und nicht nur wieder aufgenommen) wird, liegt das Problem an einer anderen Stelle und mein Vorschlag kann es möglicherweise nicht beheben.
quelle
Der folgende Code sollte funktionieren: -
In MainActivity onCreate:
quelle
new Notification(icon, message, when);
ist veraltet