¿Cómo poner una actividad en primer plano (parte superior de la pila)?

91

En Android, definí una actividad ExampleActivity.

Cuando se lanzó mi aplicación, se creó una instancia de esta A-Activity, digamos que sí A. Cuando el usuario hizo clic en un botón A, se creó otra instancia de B-Activity, B. Ahora la pila de tareas es BA, con B en la parte superior. Luego, el usuario hizo clic en un botón en B, se creó otra instancia de C-Activity y C. Ahora la pila de tareas es CBA, con C en la parte superior.

Ahora, cuando el usuario hace clic en un botón en C, quiero que la aplicación lleve A al primer plano, es decir, que A esté en la parte superior de la pila de tareas, ACB.

¿Cómo puedo escribir el código para que suceda?

user256239
fuente

Respuestas:

109

Puedes probar esto FLAG_ACTIVITY_REORDER_TO_FRONT(el documento describe exactamente lo que quieres)

Reno
fuente
3
Creo que debería ser FLAG_ACTIVITY_SINGLE_TOP .
26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPno ayudará aquí. Cuando ActivityC está en la parte superior de la pila y llama startActivity()para iniciar ActivityA, incluso si lo configura FLAG_ACTIVITY_SINGLE_TOP, seguirá creando una nueva instancia de ActivityA. FLAG_ACTIVITY_SINGLE_TOPsolo evita la creación de una nueva instancia si está intentando iniciar una actividad que ya está en la parte superior de la pila . En este caso, ActivityA no está en la parte superior de la pila, por lo que Android crea una nueva instancia.
David Wasser
6
¡Increíble! Se usa (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)para borrar cualquier historial después de un determinado Activity.
shkschneider
10
FLAG_ACTIVITY_REORDER_TO_FRONT se ignora si también especifica FLAG_ACTIVITY_CLEAR_TOP. Consulta la documentación.
Kris Subramanian
3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Esto funcionará bien si desea llevar su actividad al frente con la sesión de usuario si ya está en la parte superior de la pila pero no al frente.
Hassan Jamil
64

La mejor manera que encontré para hacer esto fue usar la misma intención que usa la pantalla de inicio de Android: el Lanzador de aplicaciones.

Por ejemplo:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

De esta manera, cualquier actividad en mi paquete que el usuario haya utilizado más recientemente se vuelve a traer al frente nuevamente. Encontré esto útil al usar PendingIntent de mi servicio para que el usuario vuelva a mi aplicación.

greg7gkb
fuente
2
Muchas gracias por ese fragmento de código. Perdí horas tratando de que eso funcionara correctamente.
PakitoV
3
o sin ComponentName y setComponent, pero con nuevo Intent (esto, MyMainActivity.class)
Tima
3
Extraño como esto fue lo único que funcionó para mí; poner banderas no funcionó y siempre recreó la actividad.
Steven Huang
5
Cuando leo esta respuesta y los comentarios, queda claro que tenemos un malentendido. La pregunta original es cómo reorganizar un Activitydentro de la pila de tareas. OP indica claramente que quiere moverse ActivityAde la parte inferior de la pila a la parte superior de la pila (es decir, quiere reordenar la ActividadA al frente de la pila de tareas ). Esta respuesta no hará eso. Esta respuesta es una respuesta a la pregunta "¿Cómo puedo llevar mi aplicación (pila de tareas) del fondo al primer plano?" Esa es una pregunta completamente diferente de la pregunta original de OP.
David Wasser
3
También el botón de voto a favor dice "Esta respuesta es útil" no "esta respuesta es útil para la operación"; él / ella ya tiene "marca de aceptación" para esta situación. Obviamente, no sé qué es útil para la operación, y en mi humilde opinión, rechazar las respuestas basadas en mi suposición de lo que es útil para la operación es incorrecto.
Boris Treukhov
28

Aquí hay un ejemplo de código de cómo puede hacerlo:

Intent intent = getIntent(getApplicationContext(), A.class)

Esto asegurará que solo tenga una instancia de una actividad en la pila.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}
Jan-Terje Sørensen
fuente
11

FLAG_ACTIVITY_REORDER_TO_FRONT : si se establece en un Intent pasado a Context.startActivity (), este indicador hará que la actividad iniciada se lleve al frente de la pila del historial de su tarea si ya se está ejecutando.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
FunGapApp
fuente
4

Creo que una combinación de Intentbanderas debería funcionar. En particular, Intent.FLAG_ACTIVITY_CLEAR_TOPyIntent.FLAG_ACTIVITY_NEW_TASK .

Agregue estas banderas a su intención antes de llamar startActvity.

Alabama.
fuente
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Nota: el modo de inicio de su actividad en el hogar debe ser single_task

sujith s
fuente
1

En general, creo que no se recomienda este método de gestión de actividades. El problema de reactivar una actividad dos pasos hacia abajo en The Stack es que es probable que esta actividad se haya eliminado. Mi consejo para recordar el estado de tus actividades y lanzarlas constartActivity ()

Estoy seguro de que has visto esta página, pero para tu comodidad este enlace

Segfault
fuente
0

Si desea llevar una actividad a la parte superior de la pila al hacer clic en una Notificación, es posible que deba hacer lo siguiente para que FLAG_ACTIVITY_REORDER_TO_FRONT funcione:

La solución para mí para esto fue hacer un receptor de transmisión que escuche las acciones de transmisión que desencadena la notificación. Así que básicamente:

  1. La notificación desencadena una acción de transmisión con un nombre adicional de la actividad para iniciar.

  2. El receptor de transmisión detecta esto cuando se hace clic en la notificación, luego crea una intención para iniciar esa actividad usando el indicador FLAG_ACTIVITY_REORDER_TO_FRONT

  3. La actividad se lleva a la parte superior de la pila de actividades, sin duplicados.

sakis kaliakoudas
fuente
-2

Si está utilizando "Google Cloud Message" para recibir notificaciones push con la clase "PendingIntent", el siguiente código muestra la notificación solo en la barra de acción.

Al hacer clic en la notificación no se creará ninguna actividad, la última actividad activa se restaura conservando el estado actual sin problemas.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

¡Ciao!

GFPF
fuente