Mi aplicación tiene notificaciones que, obviamente, sin ningún indicador, comienzan una nueva actividad cada vez, así que tengo varias actividades iguales ejecutándose una encima de la otra, lo cual es simplemente incorrecto.
Lo que quiero que haga es llevar la actividad especificada en la intención pendiente de notificaciones, al frente si ya se está ejecutando, de lo contrario, iniciarla.
Hasta ahora, la intención / intención 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.
onNewIntent
y el establecimiento de las banderas)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
singleInstance
propiedad. Con esto, prácticamente aborda ambos problemas que está teniendo en este momento, colocando la actividad al frente todo el tiempo y dejando que el sistema operativo cree uno nuevo automáticamente si no existe ninguna actividad o traiga al frente la actividad existente actualmente (gracias asingleInstance
propiedad).Esta es la forma en que una actividad se declara como una instancia única:
Además, para evitar una animación entrecortada cuando se inicia a través de singleInstance, puede usar en su lugar "singleTask", ambos son muy similares, pero la diferencia se explica aquí según la documentación de Google:
Espero que esto ayude.
¡Saludos!
fuente
Creo que lo que necesitas está adentro
singleTop
Activity
, en lugar de unsingleTask
osingleInstance
.Lo que dice la documentación se adapta perfectamente a sus necesidades:
Además de eso (sin juego de palabras), tenía exactamente la misma necesidad que tú. Probé todas las
launchMode
banderas para descubrir cómo se comportan realmente en la práctica y, como resultado, ensingleTop
realidad 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 desingleInstance
eso, la muestra dos veces debido a que no lo hace) Permitir que cualquier otroActivity
sea parte de su tarea), y comportarse adecuadamente independientemente del objetivoActivity
ya existente o no.fuente
Este es un hilo viejo, pero para todos aquellos que todavía están buscando respuesta, aquí está mi solución. Está puramente en código, sin configuración de manifiesto:
Aquí FLAG_ACTIVITY_SINGLE_TOP abre la actividad existente si está en la parte superior de la pila de tareas. Si no está en la parte superior, pero dentro de la pila, FLAG_ACTIVITY_CLEAR_TOP eliminará todas las actividades además de la actividad objetivo y la mostrará. Si la actividad no está en la pila de tareas, se creará una nueva. Un punto crucialmente importante para mencionar: el segundo parámetro de PendingIntent.getActivity (), es decir, requestCode debería tener un valor distinto de cero (incluso lo llamé NON_ZERO_REQUEST_CODE en mi fragmento), de lo contrario, esos indicadores de intención no funcionarán. No tengo idea de por qué es como es. Marcar FLAG_ACTIVITY_SINGLE_TOP es intercambiable con android: launchMode = "singleTop" en la etiqueta de actividad en el manifiesto.
fuente
Sé que es viejo, pero nada de lo anterior se ajustaba a mi aplicación.
Sin cambiar los manifiestos y otras configuraciones, aquí está el código para devolver su aplicación al frente, o abrirla cuando está cerrada
fuente
Intenté esto, y funcionó a pesar de que el IDE se quejaba del código
fuente
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
no es una bandera válida paraPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
no es un indicador válido cuando se usa comoPendingIntent
. ¿O tal vez quisiste decir que no es válido pasar algetActivity
método, pero es válido para usar comoIntent
bandera que luego se usa como unPendingIntent
?Dado que usted dice que desea comenzar su actividad si aún no ha comenzado, tal vez no le importaría reiniciarla. También probé un montón 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 asociado previamente con ella.
Solo API11 +.
fuente
Tuve un problema similar después de agregar notificaciones como se encuentra en el sitio de capacitación de Android . Ninguna de las otras respuestas aquí funcionó para mí, sin embargo, esta respuesta funcionó para mí. Resumen:
fuente