Intención: si la actividad se está ejecutando, tráigala al frente, de lo contrario comience una nueva (a partir de la notificación)

Mi aplicación tiene notificaciones que, obviamente, sin ninguna marca, comienzan una nueva actividad cada vez, así que tengo varias actividades que se ejecutan una encima de la otra, lo cual es simplemente incorrecto.

Lo que quiero hacer es llevar la actividad especificada en las notificaciones pendientes de bash, al frente si ya está en ejecución, de lo contrario, iníciela.

Hasta el momento, el bash / bash pendiente de esa notificación que tengo es

private static PendingIntent prepareIntent(Context context) { Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } 

y extrañamente, a veces funciona, a veces no … Siento que ya he probado todas las combinaciones de banderas.

Puedes usar esto:

  

que funcionará de forma similar a "singleInstance" pero no tendrá esa animación extraña.

Creo que la mejor manera de hacerlo y de una manera simple es comenzar la actividad normalmente, pero establecer esa actividad en el manifiesto con la propiedad singleInstance . Con esto, prácticamente aborda ambos problemas que tiene en este momento, al llevar la actividad al frente todo el tiempo, y dejar que el sistema operativo cree automáticamente uno nuevo si no existe actividad o llevar al frente la actividad existente actualmente (gracias a la propiedad singleInstance ).

Esta es la forma en que una actividad se declara como una sola instancia:

  

Además, para evitar una animación entrecortada al iniciar SingleInstance, puede usar “singleTask”, ambos son muy similares, pero la diferencia se explica aquí según la documentación de Google:

  

singleInstance es lo mismo que “singleTask”, excepto que el sistema no inicia ninguna otra actividad en la tarea que contiene la instancia. La actividad siempre es el único y único miembro de su tarea.

Espero que esto ayude.

¡Saludos!

Creo que lo que necesitas es singleTop Activity , en lugar de singleTask o singleInstance .

  

Lo que dice la documentación se adapta perfectamente a sus necesidades:

[…] también se puede crear una nueva instancia de una actividad ” singleTop ” para manejar una nueva intención. Sin embargo, si la tarea objective ya tiene una instancia existente de la actividad en la parte superior de su stack, esa instancia recibirá la nueva intención (en una llamada onNewIntent() ); una nueva instancia no se crea. En otras circunstancias, por ejemplo, si una instancia existente de la actividad ” singleTop ” está en la tarea objective, pero no en la parte superior de la stack, o si está en la parte superior de una stack, pero no en la tarea objective, una Se crearía una nueva instancia y se presionaría en la stack.

Además de eso (sin juego de palabras), tenía exactamente la misma necesidad que tú. launchMode todas las banderas de launchMode para descubrir cómo se comportan realmente en la práctica y, en consecuencia, singleTop es lo mejor para esto: no hay animación extraña, la aplicación se muestra una vez en la lista de aplicaciones recientes (a diferencia de singleInstance que la muestra dos veces debido al hecho no permite que ninguna otra Activity forme parte de su tarea) y su comportamiento es correcto independientemente de si la Activity objective ya existe o no.

Como dices que quieres comenzar tu actividad si aún no la has comenzado, tal vez no te importe reiniciarla. También probé una tonelada de sugerencias y combinaciones de banderas para la intención, esto siempre traerá la actividad que necesita al frente, aunque no mantendrá ningún estado previamente asociado.

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 

API11 + solo

Sé que es viejo, pero nada de lo anterior se ajustaba a mi solicitud.

Sin cambiar los manifiestos y otras configuraciones, aquí está el código para volver a poner tu aplicación en primer plano o abrirla cuando esté cerrada

 Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); notificationIntent.setPackage(null); // The golden row !!! notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 

Intenté esto, y funcionó a pesar de que el IDE se quejaba del código

 Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT) .setSmallIcon(R.drawable.cast_ic_notification_0) .setContentTitle("Title") .setContentText("Content") .setContentIntent(intent) .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5; .setAutoCancel(true) /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/; NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build());