Meu MainActicity
começo RefreshService
com um Intent
que tem um boolean
extra chamadoisNextWeek
.
Meu RefreshService
faz um Notification
que inicia meu MainActivity
quando o usuário clica nele.
isso é assim:
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);
Como você pode ver, notificationIntent
deve ter o boolean
extra IS_NEXT_WEEK
com o valor isNextWeek
colocado no PendingIntent
.
Quando clico agora Notification
, sempre obtenho false
o valor deisNextWeek
É assim que obtenho o valor no MainActivity
:
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
Registro:
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
Quando eu inicio diretamente o MainActivity
com um Intent
com o "Próximo Valor", desta forma:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
tudo funciona bem e eu entendo true
quando isNextWeek
é true
.
O que eu faço de errado que sempre exista um false
valor?
ATUALIZAR
isso resolve o problema: https://stackoverflow.com/a/18049676/2180161
Citar:
Minha suspeita é que, como a única coisa que muda no Intent são os extras, o
PendingIntent.getActivity(...)
método de fábrica é simplesmente reutilizar o antigo intento como uma otimização.Em RefreshService, tente:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Vejo:
http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
ATUALIZAÇÃO 2
Veja a resposta abaixo por que é melhor usar PendingIntent.FLAG_UPDATE_CURRENT
.
Respostas:
Usar PendingIntent.FLAG_CANCEL_CURRENT não é uma boa solução devido ao uso ineficiente de memória. Em vez disso, use PendingIntent.FLAG_UPDATE_CURRENT .
Use também Intent.FLAG_ACTIVITY_SINGLE_TOP (a atividade não será iniciada se já estiver em execução na parte superior da pilha do histórico).
Então:
Deve funcionar agora.
Se você ainda não esperava um comportamento, tente implementar o
void onNewIntent(Intent intent)
manipulador de eventos, para acessar a nova intenção que foi chamada para a atividade (que não é a mesma que chamar getIntent (), isso sempre retornará o primeiro Intent lançado sua atividade.fonte
Eu acho que você precisa atualizar
Intent
quando receber uma nova substituindoonNewIntent(Intent)
em sua Atividade. Adicione o seguinte à sua atividade:Editar:
Isso é necessário apenas se sua Atividade já tiver sido iniciada quando a intenção for recebida. Se sua atividade é iniciada (e não apenas retomada) pela intenção, o problema está em outro lugar e minha sugestão pode não ser corrigida.
fonte
O código a seguir deve funcionar: -
Em MainActivity onCreate:
fonte
new Notification(icon, message, when);
está obsoleto