Intención con el extra antiguo en onCreate () para singleTask Actividad

Por ejemplo he creado un proyecto con 2 actividades: FirstActivity con android: launchMode = "singleTask" flag y SecondActivity.

En el primer usuario comienza FirstActivity y después de que SecondActivity se iniciará al hacer clic en el botón. Desde SecondActivity creamos una notificación de barra de estado.

Intent intent = new Intent(SecondActivity.this, FirstActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra(FirstActivity.ARG, true); NotificationCompat.Builder builder = new NotificationCompat.Builder(SecondActivity.this); builder.setSmallIcon(R.drawable.ic_launcher) .setAutoCancel(true) .setContentTitle("title") .setContentText("message"); PendingIntent notifyIntent = PendingIntent.getActivity(SecondActivity.this, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(notifyIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(1000, builder.build()); 

Cuando hice clic en esta notificación y mi aplicación se está ejecutando ahora, FirstActivity # onNewIntent método se ejecutará y la intención contiene ARG extra = true. Está bien situación.

Cuando hice clic en esta notificación y mi aplicación NO se está ejecutando ahora, FirstActivity # onNewIntent método no se ejecutará, pero en lugar de este FirstActivity # onCreate () se ejecutará y puedo obtener mi bandera ARG como getIntent().getBooleanExtra(ARG, false) Esta intención contiene ARG extra = true. Es la situación correcta también.

Pero cuando intento salir de mi aplicación después de la Situación 2 presionando el botón de nuevo y ejecutar la aplicación de nuevo, recibí en FirstActivity # onCreate () intención con ARG = true (antiguo valor extra que traté). ¿Por qué mi bandera es "true" después de volver a abrir la aplicación?

One Solution collect form web for “Intención con el extra antiguo en onCreate () para singleTask Actividad”

Me encontré con esta pregunta mientras buscaba una solución a un problema similar. A pesar de que esta pregunta es de hace un año, voy a escribir cómo lo resolví en caso de que pueda ayudar a alguien más porque me tomó muchas horas para resolver mi problema. También tengo la actividad declarada con el android: launchMode como "singleTask". Se envía una notificación desde un servicio y esta notificación tiene un PendingIntent con una intención de abrir MyActivity.

Mi solución es establecer el flag FLAG_ACTIVITY_NEW_TASK ( http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK ) en la intención. A continuación, cree la intención Pendiente con id 0 y PendingIntent.FLAG_CANCEL_CURRENT.

 Intent _intent = new Intent(context, MyActivity.class); _intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); _intent.putExtra("DATA", myData); PendingIntent _pIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

Cada vez que se hace clic en la notificación se crea una instancia de MyActivity en una nueva tarea y onCreate se llama. El intento contiene los datos adicionales correctos. Cuando presiono el botón de retroceso y hay una nueva notificación, la intención siempre trae los datos adicionales más recientes. Si ya existe una instancia de la actividad (por ejemplo, cuando presiono el botón de la pantalla de inicio), se llama al método onNewIntent y la intención trae los nuevos datos adicionales correctos.

Esto se explica claramente en http://developer.android.com/guide/topics/manifest/activity-element.html#lmode . También intenté usar diversos códigos de la petición (arg 2) por la notificación en PendingIntent.getActivity y con PendingIntent.FLAG_UPDATE_CURRENT pero pienso que el secreto está en la definición de launchMode como singleTask e Intent.FLAG_ACTIVITY_NEW_TASK.

También tengo otro caso en el que el launchMode es "estándar". Aquí también se inicia la actividad haciendo clic en una notificación enviada desde un servicio. Para que la actividad iniciada reciba los datos adicionales correctos, establezco el indicador FLAG_ACTIVITY_SINGLE_TOP.

 _intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

Este indicador hace que el método onNewIntent sea llamado cuando una instancia de la actividad ya existe (cuando presioné el botón de la pantalla de inicio por ejemplo). De nuevo con los datos adicionales correctos. De lo contrario onCreate se llama también con los datos adicionales correctos (cuando presioné el botón de retroceso, por ejemplo).

La intención Pendiente se crea con un nuevo código de solicitud cada vez, pero debería funcionar también con el mismo código de solicitud. Creo que el secreto está en launchMode y el flag de intenciones establecido.

 PendingIntent pIntent = PendingIntent.getActivity(this, notificationRequestCode, _intent, PendingIntent.FLAG_CANCEL_CURRENT); 
  • Eliminar alarma de AlarmManager mediante cancel () - Android
  • Android - ¿Qué es un PendingIntent?
  • Interacción con AsyncTask de la barra de notificación
  • ¿Cómo enviar una emisión ordenada en un PendingIntent?
  • ¿Cómo puede detectar si su actividad está siendo onPaused debido a un PendingIntent que creó?
  • Alarma pendiente La alarma no se cancela
  • Eliminar los datos de la intención de notificación
  • Servicio para la pantalla de bloqueo antes de abrir la aplicación
  • Android: la bandera de tareas no funciona para PendingIntent
  • Android ListView en el widget onClick no funciona
  • ¿Cuándo usar IntentSender vs. PendingIntent?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.