Cómo brindar compatibilidad con varias pilas de actividades

El componente Navigation funciona con el sistema operativo Android para mantener la pila de actividades a medida que el usuario navega en tu app. En algunos casos, podría ser útil mantener varias pilas de actividades al mismo tiempo, mientras que el usuario se mueve entre ellas. Por ejemplo, si tu app incluye navegación inferior o un panel lateral de navegación, la compatibilidad con varias pilas de actividades permite a los usuarios cambiar con libertad entre flujos en tu app sin perder su lugar en ninguno de ellos.

El componente Navigation proporciona APIs que admiten varias pilas de actividades cuando se guarda y se restablece el estado de los destinos en el gráfico de navegación. La clase NavigationUI incluye métodos que controlan esto automáticamente, pero también puedes usar las APIs subyacentes de forma manual para una implementación más personalizada.

Cómo implementar la compatibilidad automática con NavigationUI

La clase NavigationUI incluye APIs que guardan y restablecen automáticamente el estado de los elementos de menú a medida que el usuario se mueve entre ellos. Estas APIs admiten varias pilas de actividades de forma predeterminada en los siguientes casos:

Estas APIs no requieren más cambios de código para implementar la compatibilidad con varias pilas de actividades. Además, que son la forma recomendada de admitir varias pilas de actividades en tu app.

Cómo implementar la compatibilidad manual con las APIs subyacentes

Si los elementos que brinda NavigationUI no satisfacen tus requisitos, puedes usar las APIs subyacentes para guardar y restablecer pilas de actividades a través de una de las otras plataformas de API que proporciona el componente de Navigation.

En el archivo XML de Navigation, los elementos <action> de tu gráfico de navegación pueden usar el atributo app:popUpToSaveState para guardar el estado de cualquier destino que la acción muestre con app:popUpTo. También pueden usar el atributo app:restoreState a fin de restablecer cualquier estado guardado previamente para el destino definido en el atributo app:destination.

Puedes usar estos atributos para admitir varias pilas de actividades. Cuando una acción de navegación necesite mover al usuario de una pila de actividades a otra, configura app:popUpToSaveState y app:restoreState en true en el elemento <action> correspondiente. De esa manera, la acción guarda el estado de la pila de actividades actual y, al mismo tiempo, se restablece el estado que había guardado anteriormente.

En el siguiente ejemplo, se muestra una acción que usa ambos atributos:

<action
  android:id=”@+id/swap_stack”
  app:destination=”@id/second_stack”
  app:restoreState=”true”
  app:popUpTo=”@id/first_stack_start_destination”
  app:popUpToSaveState=”true” />

La clase NavOptions te permite pasar opciones de navegación especiales para guardar y restablecer pilas de actividades cuando navegas usando una NavController. Esto es así, ya sea que crees tu instancia de NavOptions con el DSL de Kotlin o con NavOptions.Builder:

Kotlin

// Use the navigate() method that takes a navOptions DSL Builder
navController.navigate(selectedBottomNavRoute) {
  launchSingleTop = true
  restoreState = true
  popUpTo(navController.graph.findStartDestination().id) {
    saveState = true
  }
}

Java

NavOptions navOptions = new NavOptions.Builder()
  .setLaunchSingleTop(true)
  .setRestoreState(true)
  .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
    false, // inclusive
    true) // saveState
  .build();
navController.navigate(selectedBottomNavId, null, navOptions);

Si quieres obtener más información para pasar las opciones de navegación, consulta Cómo aplicar NavOptions de manera programática.

Recursos adicionales

Para obtener más información sobre la compatibilidad con varias pilas de actividades con el componente Navigation, consulta los siguientes recursos adicionales:

Entradas de blog

Ejemplos