Сборка бэкстека фрагментов с помощью NavDeepLinkBuilder

У меня есть приложение с одной активностью, с тремя фрагментами, A, B, C. В обычном потоке приложения фрагменты открываются последовательно: A-> B-> CI имеют службу переднего плана с уведомлением, которое при нажатии должно открывать фрагмент C. Я использую компонент архитектуры навигации и добавляю пункт назначения в уведомление как ссылку на контент:

NotificationCompat.Builder(context, NOTIFICATION_CHANNEL)
    ....
    .setContentIntent(NavDeepLinkBuilder(context)
        .setGraph(R.navigation.main_navigation)
        .setDestination(R.id.fragmentC)
        .setArguments(bundle)
        .createPendingIntent())
    .build()

Backstack фрагмента не строится. Когда я возвращаюсь из фрагмента C, я сразу же попадаю во фрагмент A, а не в B. Согласно Принципы навигации backstack должен быть естественным, но я не могу этого добиться. Что мне здесь не хватает? Спасибо.


comment
Это поведение NavGraph по умолчанию.   -  person Rohit    schedule 28.05.2020


Ответы (2)


Я добился желаемого обратного стека путем рефакторинга моего навигационного графика во вложенные графы. Как кратко упоминается в справке по NavDeepLinkBuilder, "Пункт назначения и все его родители будет в заднем стеке.», и «Родительский пункт назначения является начальным пунктом назначения содержащего навигационного графа».

Вместе эти два пункта означают, что стопка будет состоять из начальных пунктов назначения всех вложенных навигационных графов, частью которых является пункт назначения deeplink.

Первоначально у меня был один навигационный граф без вложенности, и моим единственным элементом обратного стека был начальный пункт назначения этого графа. Когда я реорганизовал навигационный граф, чтобы он состоял из основного (внешнего) навигационного графа и вложенного графа, задний стек состоял из начального пункта назначения обоих графов.

person vokod    schedule 28.05.2020

Для этого вам нужно запустить свой корневой элемент (активность или фрагмент, который запустил стек), и он автоматически восстановит все до последнего добавленного фрагмента, но убедитесь, что фрагменты добавлены в стек.

В случае, если вам нужно будет восстановить другой фрагмент, вы можете прослушать это намерение и просто сбросить до нужной транзакции.

person VolodymyrH    schedule 27.05.2020
comment
Как вы запускаете корневой элемент (активность или фрагмент) с помощью NavDeepLinkBuilder? - person Shefchenko; 04.06.2020
comment
@Shefchenko, developer.android .com/reference/kotlin/androidx/navigation/ - person VolodymyrH; 04.06.2020
comment
ваша ссылка предназначена для popBackStack(), но она не запускает какой-либо корневой элемент (активность или фрагмент). - person Shefchenko; 05.06.2020
comment
@Шефченко, у него поп поп включительно - person VolodymyrH; 05.06.2020