Actividad de inicio a través de notificación: evitar actividades duplicadas

Por lo tanto, actualmente estoy mostrando una notificación. Cuando el usuario hace clic en esta noticiation, la aplicación se inicia. La notificación persiste para indicar que el servicio se está ejecutando en segundo plano.

Intent notificationIntent = new Intent(context, LaunchActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); mNotificationManager.notify(1, notification); 

Sin embargo, he detectado un caso donde aparece un error. Si el usuario inicia la aplicación haciendo clic en el ícono normal, y mientras la actividad se está ejecutando, hace clic en la notificación, luego se inicia una nueva actividad sin que la anterior salga, y la última se encuentre encima de la anterior. Y eso no es todo: más clics en la notificación creará actividades adicionales y las colocará sobre las que ya se están ejecutando. ¿Cómo puedo prevenir esto? ¿Hay algún cheque que hacer para ver si se está mostrando o cargando cierta actividad?

Esa es la forma en que se supone que es por defecto. Probablemente necesites especificar android:launchMode="singleTop" si quieres tener solo una sola instancia.
Hay 4 modos de lanzamiento, más información aquí: https://developer.android.com/guide/topics/manifest/activity-element.html

Al utilizar lanchMode="singleTask" , si ya existe una instancia de su actividad, Android no vuelve a crear la actividad, sino que la onNewIntent() con el método onNewIntent() .

Según lo documentado por Android:

El sistema crea la actividad en la raíz de una nueva tarea y enruta el bash hacia ella. Sin embargo, si ya existe una instancia de la actividad, el sistema enruta el bash a la instancia existente a través de una llamada a su método onNewIntent (), en lugar de crear uno nuevo.

Documentación de Android para el modo de actividad

Como las dos respuestas anteriores han mencionado, querrá establecer el modo de inicio de la aplicación que se define en la definición de la actividad en el manifiesto:

   

Además, es posible que desee tener en cuenta que, a pesar de que FLAG_ACTIVITY_SINGLE_TOP es una bandera de intención válida, no hay banderas de intención equivalentes para singleTask o singleInstance.

Consulte la sección launchMode para obtener más detalles sobre las diferentes opciones del modo de inicio: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode