android - open - PendingIntent no envía extras de Intención
pendingintent example (3)
Creo que debes actualizar el Intent
cuando recibas uno nuevo anulando onNewIntent(Intent)
en tu Actividad. Agregue lo siguiente a su actividad:
@Override
public void onNewIntent(Intent newIntent) {
this.setIntent(newIntent);
// Now getIntent() returns the updated Intent
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
}
Editar:
Esto es necesario solo si su actividad ya se inició cuando se recibió el intento. Si su actividad se inicia (y no se reanuda) con la intención, entonces el problema está en otra parte y mi sugerencia puede no solucionarlo.
My MainActicity
inicia RefreshService
con un Intent
que tiene un extra boolean
llamado isNextWeek
.
My RefreshService
realiza una Notification
que inicia mi MainActivity
cuando el usuario hace clic en ella.
esto se ve así:
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 puede ver, el IS_NEXT_WEEK
notificationIntent
debe tener el boolean
extra IS_NEXT_WEEK
con el valor de isNextWeek
que se coloca en el PendingIntent
.
Cuando hago clic ahora en esta Notification
siempre obtengo el valor false
de isNextWeek
Esta es la forma en que obtengo el valor en la MainActivity
:
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
Iniciar sesión:
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
Cuando comienzo directamente la MainActivity
con una Intent
con el "sNextValue" como esta:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
todo funciona bien y me hago true
cuando isNextWeek
es true
.
¿Qué hago mal que siempre hay un valor false
?
ACTUALIZAR
esto resuelve el problema: https://stackoverflow.com/a/18049676/2180161
Citar:
Mi sospecha es que, dado que lo único que cambia en el Intent son los extras, el método de fábrica
PendingIntent.getActivity(...)
simplemente está reutilizando el viejo intento como una optimización.En RefreshService, intente:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Ver:
http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
El siguiente código debería funcionar:
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);
En MainActivity onCreate:
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}
El uso de PendingIntent.FLAG_CANCEL_CURRENT no es una buena solución debido al uso ineficiente de la memoria. En su lugar, use PendingIntent.FLAG_UPDATE_CURRENT .
Use también Intent.FLAG_ACTIVITY_SINGLE_TOP (la actividad no se iniciará si ya se está ejecutando en la parte superior de la pila del historial).
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
);
Entonces:
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
int startPageNumber;
if ( savedInstanceState != null)
{
startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on
Debería funcionar ahora.
Si todavía no ha esperado el comportamiento, intente implementar el controlador de eventos void onNewIntent(Intent intent)
, de esa manera puede acceder al nuevo intento que se llamó para la actividad (que no es lo mismo que llamar a getIntent (), esto siempre devolver la primera intención que lanzó su actividad.
@Override
protected void onNewIntent(Intent intent) {
int startPageNumber;
if (intent != null) {
startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
} else {
startPageNumber = 0;
}
}