Estoy creando una aplicación ToDo simple y comprobando los métodos de navegación para volver a mi mainFragment desde AddTask Fragment. Y descubrí que puedo regresar usando navegarUp() y también popBackStack(), pero no entiendo la diferencia.
Cuando uso esto:
Navigation.findNavController(it).navigateUp()O esto:
Navigation.findNavController(it).popBackStack()Regreso al mainFragment y creo que addTaskFragment se extrajo de la pila, entonces, ¿alguien podría explicarme?
Se trata de backstack de Android. Cada vez que inicie una aplicación, la actividad se agregará a la pila de actividades ( Activity1 , por ejemplo). Ahora, si inicia Activity2 , se agregará a la parte superior de la pila. Si presiona el botón Atrás, la Activity2 se destruirá y se sacará de la parte superior de la pila y se reanudará la actividad que se había colocado debajo de la Activity2 . Revisa esta figura para entender mejor las cosas. 
La pila también funciona para fragmentos. Suponiendo que inicie FragmentA , luego FragmentB . Entonces, la pila será como FragmentB en la parte superior y FragmentA debajo de eso. FragmentB se muestra en la pantalla ahora. Si usa popBackStack() , obviamente, destruirá el FragmentB y lo sacará de la parte superior de la pila, luego buscará el fragmento superior actual en la pila, es decir, FragmentA , por lo que se reanudará. Pero si llama a navigateUp() , navegará hacia arriba a través de la pila, tal como su nombre. Cuando navegue hacia arriba desde FragmentB , llegará a FragmentA en la pila nuevamente. Es por eso que estos dos métodos tienen el mismo resultado. Pero el punto es que navigateUp() no sacará FragmentB de la parte superior de la pila y no se destruirá.
Lo siento, la respuesta aceptada ( editar: anteriormente) es absolutamente incorrecta, navigateUp() también sacará el fragmento superior de la pila trasera, si hay alguno.
Para empezar: si llegó a su destino actual desde su aplicación, actúan exactamente de la misma manera.
SOLO si llegaste al destino actual con un enlace profundo desde una aplicación diferente, se comportarán de manera diferente:
navigateUp() dejará su aplicación y regresará a la aplicación que navegó al enlace profundo en su aplicación.
popBackStack() intentará retroceder un paso en su backstack y no hará nada si no hay ninguna entrada en backstack.
Puede leer sobre las diferencias en: https://developer.android.com/reference/androidx/navigation/NavController#navigateUp()
navegar hacia arriba () Intenta navegar hacia arriba en la jerarquía de navegación. Adecuado para cuando el usuario presiona el botón "Arriba" marcado con una flecha hacia la izquierda (o inicio) en la esquina superior izquierda (o inicio) de la interfaz de usuario de la aplicación.
El comportamiento previsto de Arriba difiere de Atrás cuando el usuario no llegó al destino actual desde la propia tarea de la aplicación. por ejemplo, si el usuario está viendo un documento o enlace en la aplicación actual en una actividad alojada en la tarea de otra aplicación donde el usuario hizo clic en el enlace. En este caso, la actividad actual (determinada por el contexto utilizado para crear este NavController) finalizará y el usuario será llevado a un destino apropiado en esta aplicación en su propia tarea.
y
popBackStack() Intenta abrir la pila trasera del controlador. Análogo a cuando el usuario presiona el botón Atrás del sistema cuando el host de navegación asociado tiene el foco.