Volver a la actividad principal de la actividad creada por notificación

Estoy tratando de implementar el comportamiento descrito aquí , donde una notificación (o lo que sea) inicia una actividad “interna” en su aplicación, y luego, cuando el usuario presiona hacia atrás, va a mi actividad “casa”.

Los documentos de Android dicen

En el caso del botón Atrás, debe hacer que la navegación sea más predecible insertando en la stack posterior de la tarea la ruta de navegación ascendente completa a la pantalla superior de la aplicación . Esto permite a los usuarios que han olvidado cómo ingresaron a su aplicación navegar a la pantalla superior de la aplicación antes de salir.

¿Hay una buena manera de hacer eso? Otras preguntas sobre Stackoverflow sugieren comenzar la actividad principal con un bash que le dice que comience la actividad interna, pero eso parece un gran truco, algo que dudo que Google haya usado en Gmail, y supongo que hay un método decente, dado que están abogando por el comportamiento.

Entonces, ¿hay una forma no hacky de hacer esto?

Ajá, simplemente necesito usar PendingIntent.getActivities() lugar de getActivity() . También vale la pena mencionar es TaskStackBuilder

Aquí hay un código:

  Intent backIntent = new Intent(ctx, MainActivity.class); backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent intent = new Intent(ctx, ConversationActivity.class); intent.putExtra("whatever", whatever); final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

Solo lo probé. Funciona a las mil maravillas. Inicialmente sospeché que podría haber un problema si la aplicación ya se está ejecutando y accedes a una notificación. Es decir, la stack de actividades es (arriba a la derecha):

 [MainActivity] [SomeActivity] 

y haces clic en una notificación para ConversationActivity . ¿Lo conseguirías?

 [MainActivity] [SomeActivity] [MainActivity] [ConversationActivity] 

Bueno, resulta que obtienes mágicamente

 [MainActivity] [SomeActivity] [ConversationActivity] 

que es lo que quería, pero no tengo idea de cómo lo hace. No he establecido ninguna opción especial en ninguna de las actividades. ¡Oh bien!

Conozco 2 maneras de lograr esto:

  1. Comience su home activity desde dentro de la actividad iniciada por notificación. Esto puede ser bastante engañoso, ya que tendrá que diferenciar y realizar un seguimiento de varios posibles puntos de entrada.
  2. Siempre comienza con su home activity que comprueba si se está iniciando una notificación y luego inicia la notification activity . Esto asegura un punto de entrada consistente y la stack de respaldo estará allí cuando el usuario presione la tecla Arriba.

Saludos.

Esta solución funciona muy bien para este problema

 android:noHistory="true" 

Hay una nueva guía sobre cómo hacer esto, y sugiere algunas prácticas ligeramente diferentes a las respuestas anteriores:

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

Tenga en cuenta que en realidad no use 0 para su getPendingIntent en getPendingIntent . Para mí, cualquier número no 0 funcionó, pero 0 dio como resultado que el botón Atrás solo vaya al iniciador.

Bonito.

Pero tenga en cuenta que no funciona en el sistema pre-3.0 (nivel pre API 11) porque PendingIntent.getActivities () no está disponible allí.

Y eso es lo mismo para construir un backstack para acceder a una actividad desde una notificación (a través de Intent) y hacer que el botón Atrás se comporte de manera coherente con su aplicación (la actividad detallada vuelve a la actividad de la lista, por ejemplo).

Las actividades están asociadas a una tarea que no es más que un grupo de actividades en la stack de respaldo. Cuando abre una nueva actividad al hacer clic en la notificación, esa actividad se abre como una actividad independiente y se coloca en una nueva tarea. Esto significa que solo están presentes la actividad de notificación y la actividad principal.

Simplemente especifique el modo de inicio de su actividad como “estándar” en el archivo de manifiesto y debería resolver el problema.

 Intent resultIntent = new Intent(getApplicationContext(), ResultActivity.class); PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(notId, mBuilder.build()); 

manifiesto:

  <---