#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>
Итак, отвечая на ваши вопросы:
- Да, обязательно указывать как схему, так и хост.
- Хорошей практикой обработки двух разных ссылок в одном действии является использование разных путей. Вот так:
<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-адрес глубокой ссылки. Для этого экземпляра я хочу сделать что-то подобное