Moi MainActicity
zaczyna RefreshService
z Intent
którym ma boolean
EXTRA nazwie isNextWeek
.
My RefreshService
tworzy, Notification
który zaczyna mój, MainActivity
gdy użytkownik go kliknie.
wygląda to tak:
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);
Jak widać, notificationIntent
powinien mieć boolean
dodatek, IS_NEXT_WEEK
którego wartość isNextWeek
jest umieszczana w PendingIntent
.
Kiedy klikam teraz Notification
, zawsze otrzymuję false
wartośćisNextWeek
W ten sposób otrzymuję wartość w 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
Kiedy bezpośrednio zaczynam od MainActivity
a Intent
z ìsNextValue` w ten sposób:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
wszystko działa dobrze i dostaję, true
kiedy isNextWeek
jest true
.
Co mam zrobić źle, że zawsze jest jakaś false
wartość?
AKTUALIZACJA
to rozwiązuje problem: https://stackoverflow.com/a/18049676/2180161
Zacytować:
Podejrzewam, że ponieważ jedyną rzeczą zmieniającą się w Intencji są dodatki,
PendingIntent.getActivity(...)
metoda fabryczna polega po prostu na ponownym wykorzystaniu starej intencji jako optymalizacji.W RefreshService spróbuj:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Widzieć:
http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
AKTUALIZACJA 2
Zobacz odpowiedź poniżej, dlaczego lepiej jest używać PendingIntent.FLAG_UPDATE_CURRENT
.
Odpowiedzi:
Używanie PendingIntent.FLAG_CANCEL_CURRENT nie jest dobrym rozwiązaniem z powodu nieefektywnego wykorzystania pamięci. Zamiast tego użyj PendingIntent.FLAG_UPDATE_CURRENT .
Użyj również Intent.FLAG_ACTIVITY_SINGLE_TOP (działanie nie zostanie uruchomione, jeśli jest już uruchomione na szczycie stosu historii).
Następnie:
Teraz powinno działać.
Jeśli nadal nie spodziewasz się zachowania, spróbuj zaimplementować
void onNewIntent(Intent intent)
procedurę obsługi zdarzeń, aby uzyskać dostęp do nowej intencji, która została wywołana dla działania (co nie jest tym samym, co samo wywołanie metody getIntent (), zawsze zwróci to pierwszą intencję, która została uruchomiona Twoja aktywność.źródło
Myślę, że musisz zaktualizować,
Intent
kiedy otrzymasz nowy, nadpisująconNewIntent(Intent)
w swojej aktywności. Dodaj następujące elementy do swojej aktywności:Edytować:
Jest to potrzebne tylko wtedy, gdy Twoja aktywność została już rozpoczęta w momencie odebrania intencji. Jeśli Twoja aktywność została rozpoczęta (a nie tylko wznowiona) przez zamiar, problem występuje gdzie indziej i moja sugestia może go nie naprawić.
źródło
Poniższy kod powinien działać: -
W MainActivity onCreate:
źródło
new Notification(icon, message, when);
jest przestarzałe