Android — глубокая привязка с похожими URL-адресами

#android #deep-linking

#Android #глубокая привязка

Вопрос:

Я выполняю глубокую привязку (используя навигацию jetpack), и логика, похоже, работает. Проблема, с которой я сталкиваюсь, заключается в том, что логика для activity_discover_detail, похоже, блокирует логику для fragment_discover_landing

Как бы мне предотвратить это?

Вот активность и фрагмент, о которых идет речь, из моего навигационного графика:

  <fragment
        android:id="@ id/fragment_discover_landing"
        android:name="com.my.app.fragments.DiscoverLandingFragment"
        android:label="@string/nav_discover_landing"
        tools:layout="@layout/discover_landing_fragment">

        <action
            android:id="@ id/fragment_discover_landing_back_action"
            app:popUpTo="@id/fragment_reading_lists"
            app:popUpToInclusive="false" />
        <argument
            android:name="category"
            android:defaultValue="Latest"
            app:argType="string" />
        <argument
            android:name="searchText"
            app:argType="string" />
        <argument
            android:name="searchMode"
            android:defaultValue="false"
            app:argType="boolean" />
        <deepLink
            android:id="@ id/discover_landing_category"
            app:uri="myAppName://discover/category?name={category}" />
    </fragment>

    <activity
        android:id="@ id/activity_discover_detail"
        android:name="com.my.app.activities.DiscoverDetailActivity"
        tools:layout="@layout/activity_discover_detail">

        <argument
            android:name="already_handled"
            android:defaultValue="true"
            app:argType="boolean" />
        <deepLink
            android:id="@ id/in_app_sell_page"
            app:uri="myAppName://discover/{contentId}" />
    </activity>
  

Ответ №1:

Я думаю, что это происходит потому, что myAppName://discover/{contentId} является более общим и содержит myAppName://discover/category?name={category} .

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

возможно, ссылка, подобная этой, сработает : myAppName://discover/detail/{contentId}

Также я не знаком с новой глубинной привязкой навигационного компонента, но я не вижу в вашем коде, где вы определяете переменную, contentId что определено в DiscoverDetailActivity области already_handled , я не знаю, нормально ли это.

Редактировать

Если у вас нет контроля над форматами ссылок, я бы посоветовал иметь единую точку входа для глубоких ссылок в вашем навигационном графике, чем выполнять надлежащий синтаксический анализ, сопоставление, перенаправление. это было бы прозрачное действие, LinkDispatcherActivity которое перехватывает все ссылки вашего приложения, вы можете использовать .* подстановочный знак для определения ваших ссылок: это <deepLink app:uri="myAppHost://myAppScheme/.*"/> соответствовало бы и перехватывало все ссылки, начинающиеся с myAppHost://myAppScheme .

Комментарии:

1. хороший глаз 🙂 . его еще нет. в данный момент тестирую глубокую ссылку и не закончил вводить аргументы. бит «already_handled» — это остаток старого кода, который находится в процессе рефакторинга

2. Это наверняка сработало бы… но я должен посмотреть, может ли серверная команда и желает ли она изменить свои пункты назначения

3. на данный момент поиск способа справиться с этим в приложении по-прежнему является приоритетом