Intención – si la actividad se está ejecutando, llevarla al frente, de lo contrario iniciar una nueva (de la notificación)

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

Lo que quiero hacer es llevar la actividad especificada en las notificaciones pendientes de intención, al frente si ya se está ejecutando, de lo contrario iniciarlo.

Hasta ahora, la intención / intención pendiente para la 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 cada combinación de banderas.

Puede utilizar esto:

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

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 sencilla es iniciar la actividad normalmente, pero establecer esa actividad en el manifiesto con la propiedad singleInstance . Con esto prácticamente abordas ambos temas que estás teniendo ahora, poniendo la actividad al frente todo el tiempo, y dejando que el sistema operativo cree automáticamente uno nuevo si no hay actividad o trae al frente la actividad actualmente existente (gracias a la Propiedad singleInstance ).

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

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

También para evitar una animación intermitente cuando se inicia a través de singleInstance, puede utilizar en su lugar "singleTask", ambos son muy similares, pero la diferencia se explica aquí como por la documentación de Google:

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

SingleInstance es igual que "singleTask", excepto que el sistema no inicia ninguna otra actividad en la tarea que contiene la instancia. La actividad es siempre el único y único miembro de su tarea.

Espero que esto ayude.

¡Saludos!

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

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

Lo que la documentación dice que 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 de destino 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() ); No se crea una instancia nueva. En otras circunstancias, por ejemplo, si una instancia existente de la actividad " singleTop " está en la tarea de destino, pero no en la parte superior de la pila, o si está en la parte superior de una pila, pero no en la tarea de destino Se creará una nueva instancia y se empujará en la pila.

Encima de eso (sin juego de palabras), tenía exactamente la misma necesidad que usted. He probado todos los indicadores launchMode para averiguar cómo se comportan realmente en la práctica y como resultado singleTop es en realidad el mejor para esto: ninguna animación extraña, la aplicación se muestra una vez en la lista de aplicaciones recientes (a diferencia de singleInstance que muestra dos veces debido al hecho No permite que ninguna otra Activity sea ​​parte de su tarea) y un comportamiento adecuado independientemente de que la Activity destino ya exista o no.

Dado que usted dice que desea iniciar su actividad si no se ha iniciado ya, tal vez no le moleste reiniciarlo. He probado una tonelada de sugerencias y combinaciones de la bandera para la intención también, esto siempre traerá la actividad que necesita para el frente, aunque no mantendrá ningún estado previamente asociado con él.

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

API11 + solamente.

He intentado 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()); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.