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?
android
android-intent
android-activity
user256239
fuente
fuente
FLAG_ACTIVITY_SINGLE_TOP
no ayudará aquí. Cuando ActivityC está en la parte superior de la pila y llamastartActivity()
para iniciar ActivityA, incluso si lo configuraFLAG_ACTIVITY_SINGLE_TOP
, seguirá creando una nueva instancia de ActivityA.FLAG_ACTIVITY_SINGLE_TOP
solo 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.(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)
para borrar cualquier historial después de un determinadoActivity
.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.
fuente
Activity
dentro de la pila de tareas. OP indica claramente que quiere moverseActivityA
de 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.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; }
fuente
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);
fuente
Creo que una combinación de
Intent
banderas debería funcionar. En particular,Intent.FLAG_ACTIVITY_CLEAR_TOP
yIntent.FLAG_ACTIVITY_NEW_TASK
.Agregue estas banderas a su intención antes de llamar
startActvity
.fuente
i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
Nota: el modo de inicio de su actividad en el hogar debe ser single_task
fuente
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 con
startActivity ()
Estoy seguro de que has visto esta página, pero para tu comodidad este enlace
fuente
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:
La notificación desencadena una acción de transmisión con un nombre adicional de la actividad para iniciar.
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
La actividad se lleva a la parte superior de la pila de actividades, sin duplicados.
fuente
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!
fuente