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); 
  • PendingIntent obtener requestCode
  • ¿Cómo abrir la aplicación principal de la usable?
  • Buscando explicación de los laicos sobre el concepto de intención pendiente
  • Android: PendingIntent de la notificación no activa el onCreate () si se vuelve a activar la actividad en la pantalla
  • Android: Inicie el servicio con Context.startService vs PendingIntent.getService
  • Intento pendiente con intención diferente pero id. Mismo
  • ¿Cómo regresar a mi aplicación, después de llamar intención externa (api de calendario) y hacer algo de trabajo?
  • ¿Cómo cancelar la tarea de repetición en el Administrador de alarmas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.