pendingintent open notification from example ejemplo activity android android-intent android-service android-pendingintent

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; } }