¿Cómo llevar una actividad al primer plano (parte superior de la stack)?

En Android, definí una actividad ExampleActivity.

Cuando se lanzó mi aplicación, se creó una instancia de esta A-Activity, digamos que es A Cuando el usuario hizo clic en un botón en A , se creó otra instancia de B-Activity, B. Ahora la stack de tareas es BA, con B en la parte superior. Luego, el usuario hizo clic en un botón en B, otra instancia de C-Activity, y se creó C. Ahora la stack 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 A al primer plano, es decir, hacer que A esté en la parte superior de la stack de tareas, ACB.

¿Cómo puedo escribir el código para hacerlo realidad?

Puede probar FLAG_ACTIVITY_REORDER_TO_FRONT (el documento describe exactamente lo que desea)

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

Por ejemplo:

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

De esta forma, cualquiera que sea la actividad en mi paquete que el usuario haya utilizado más recientemente vuelve a estar en primer plano. Encontré esto útil al usar el PendingIntent de mi servicio para que el usuario regrese a mi aplicación.

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

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

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

 private static Intent getIntent(Context context, Class< ?> cls) { Intent intent = new Intent(context, cls); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); return intent; } 

FLAG_ACTIVITY_REORDER_TO_FRONT : si se establece en un Inten pasa a Context.startActivity (), este indicador hará que la actividad iniciada se ponga al frente de la stack 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); 

Creo que una combinación de banderas de Intent debería ser el truco. En particular, Intent.FLAG_ACTIVITY_CLEAR_TOP y Intent.FLAG_ACTIVITY_NEW_TASK .

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

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Tenga en cuenta que su modo de inicio de actividad en casa debe ser single_task

En general, creo que este método de gestión de la actividad no es recomendable. El problema con la reactivación de una actividad dos pasos hacia abajo en The Stack es que esta actividad probablemente haya sido eliminada. Mi consejo es recordar el estado de tus actividades y lanzarlas con startActivity ()

Estoy seguro de que ha visto esta página, pero para su conveniencia, este enlace

Si desea llevar una actividad a la parte superior de la stack al hacer clic en una Notificación, entonces puede necesitar hacer lo siguiente para hacer que funcione FLAG_ACTIVITY_REORDER_TO_FRONT:

La solución para mí para esto fue crear un receptor de difusión que escucha 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 difusión capta esto cuando se hace clic en la notificación, luego crea una intención para iniciar esa actividad usando la bandera FLAG_ACTIVITY_REORDER_TO_FRONT

  3. La actividad se lleva a la cima de la stack de actividades, sin duplicados.

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

Al hacer clic en la notificación, no se creará actividad, la última actividad activa se restaura y se mantiene 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!