notificaciones notificacion android android-intent android-activity android-pendingintent

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



notificacion android (6)

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 intento, al frente si ya está en ejecución, de lo contrario, iníciela.

Hasta el momento, el intento / intento 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.


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


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:

<activity android:name=".YourActivity" android:launchMode="singleInstance"/>

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:

<activity android:name=".YourActivity" android:launchMode="singleTask"/>

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 .

<activity android:name=".MyActivity" android:launchMode="singleTop" ...the rest... >

Lo developer.android.com/guide/topics/manifest/… 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 objetivo ya tiene una instancia existente de la actividad en la parte superior de su pila, 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 objetivo, pero no en la parte superior de la pila, o si está en la parte superior de una pila, pero no en la tarea objetivo, una Se crearía una nueva instancia y se presionaría en la pila.

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 objetivo ya existe o no.


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());


Puedes usar esto:

<activity android:name=".YourActivity" android:launchMode="singleTask"/>

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


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