Обязательно указывать «android: host» для всех URL-адресов в Android для глубокой ссылки?

#android #kotlin #android-intent #android-pendingintent #intentfilter

#Android #kotlin #android-намерение #android-pendingintent #intentfilter

Вопрос:

Я должен отфильтровать два URL-адреса для действия. Я использую глубокие ссылки на содержимое приложения, указав URL-адрес для экрана глубокой ссылки.

Это мои URL-адреса

  • appdemo:// deeplink
  • родной://

Я уже добавил эти две схемы в свой файл манифеста Android, выглядит так

             <data android:scheme="appdemo" android:host="deeplink" />
            <data android:scheme="native" />
 

мой вопрос заключается в том, что, предоставляя scheme и host в файле манифеста Android, native:// эта ссылка не работает. для этого также требуется имя android: host
(собственное: // deeplink).

Обязательно указывать «android: host» для всех URL-адресов в Android? Если нет, как я могу указать другую схему.

Ответ №1:

Идея, помимо глубоких ссылок, заключается в использовании той же структуры, что и обычные ссылки:

 scheme://host/path
 

Главное преимущество заключается в том, что вы можете научить свое приложение даже открывать некоторые интернет-ссылки, например, открывать youtube (Android спросит, хотите ли вы открыть в браузере или в приложении YouTube или в вашем приложении):

     <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="http"/>
        <data android:scheme="https"/>
        <data android:host="youtube.com"/>
        <data android:host="www.youtube.com"/>
        <data android:host="m.youtube.com"/>
        <data android:host="youtu.be"/>
        <data android:pathPattern=".*"/>
    </intent-filter>
 

Итак, отвечая на ваши вопросы:

  1. Да, обязательно указывать как схему, так и хост.
  2. Хорошей практикой обработки двух разных ссылок в одном действии является использование разных путей. Вот так:
     <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="appdemo" android:host="deeplink" android:pathPrefix="/path1/"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="appdemo" android:host="deeplink" android:pathPrefix="/path2/"/>
    </intent-filter>
 

Затем вы можете получить свой путь в onNewIntent :

 Uri data = intent.getData();
String path = data == null ? null : data.getPath();
 

… и постройте некоторую логику в зависимости от этого пути.

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

1. спасибо за ваш ответ, это помогло мне мыслить по-другому.

Ответ №2:

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

         <activity
        android:name=".DeepLinkActivity"
        android:exported="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.Launcher">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="appdemo" android:host="deeplink" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="native" />
        </intent-filter>

    </activity>
 

Теперь оба моих URL-адреса переходят к deeplink Activity.

 appdemo://deeplink
native://
 

Считаете ли вы, что это не оптимизированный способ?
Любые другие предложения по этому поводу, пожалуйста, укажите.

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

1. В целом использование только scheme не является хорошей практикой. Например, вы не можете открыть сайт «https: //».

2. Я хочу открыть веб-просмотр и действие для нажатия кнопки. Поэтому я думаю, что если ссылка действительна, откройте веб-просмотр, иначе откройте новое действие. А также это действие указывает на другой URL-адрес глубокой ссылки. Для этого экземпляра я хочу сделать что-то подобное