Подтвердить что ты не робот

Android: понимание Intent-Filters

Я хотел бы создать Intent-Filter, чтобы определенные ссылки запускали начало моего приложения (см. этот поток stackoverflow-потока, например: Как зарегистрировать некоторое пространство имен URL ( myapp://app.start/) для доступа к вашей программе, вызывая URL-адрес в браузере в ОС Android?)

При попытке, я понял, что я не совсем понимаю, как на самом деле работают Intents и Intent-Filters (определенные в Manifest.xml). В чем разница между следующим:

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

или следующее:

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

И какова на самом деле разница между категорией и действием Intent-Filters. Я прочитал эту страницу http://developer.android.com/reference/android/content/Intent.html, но я до сих пор не понял базового понимания.

4b9b3361

Ответ 1

Вместо того, чтобы смотреть на него с точки зрения вашего приложения, переверните его и посмотрите на него со стороны Intent.

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

Чтобы сделать это, у намерений есть несколько частей информации, прикрепленных к ним. Среди них - действия и категории.

Действия определяют в общем виде действие, которое намерение намерено делать, например VIEW-контакт, PICK изображение из галереи и т.д.

Категория - это дополнительная информация, которая дает намерение другим способом дифференцировать себя. Например, при щелчке ссылки в браузере, созданное намерение имеет прикрепленную к нему категорию BROWSABLE.

Итак, когда ОС разрешает Intent, он будет искать зарегистрированные действия или BroadcastReceivers, у которых есть фильтр намерений, который включает все части информации. Если Intent указывает действие PICK, то действия, которые не имеют фильтра намерения с действием PICK, будут отброшены из списка кандидатов для обработки намерения.

Таким образом, объединенный набор действий, категорий, типов и (возможно) схем, связанных с намерением, служит для определения набора действий, которые могут обрабатывать намерение. Когда вы настраиваете свой фильтр намерений в манифесте, вы сообщаете OS, какой класс Intents вы можете обрабатывать.

Ответ 2

Мне нужно было изучить код android.content.IntentFilter.matchCategories(Set<String> categories), чтобы понять соответствие категорий:

  • Успешное совпадение, если у вашего IntentFilter есть категории, а Intent не предоставляет категории.
  • Успешное совпадение, если ваш IntentFilter имеет все категории намерений. Фильтр также может иметь дополнительные категории.
  • Нет совпадений, если у вашего IntentFilter нет категорий, а в Intent есть категории.
  • Нет совпадений, если у вашего IntentFilter нет категорий, у которых есть намерение

Особенно # 1 и # 3 не очевидны.