Android: понимание фильтров намерений

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

Пытаясь, я понял, что не совсем понимаю, как на самом деле работают намерения и фильтры намерений (определенные в 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, но мне все еще не хватает базового понимания.


person Pascal Klein    schedule 01.04.2011    source источник


Ответы (2)


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

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

Для этого к намерениям прикреплено несколько частей информации. Среди них есть действия и категории.

Действия определяют в общем виде действие, которое хочет выполнить намерение, например ПРОСМОТР контакта, ВЫБОР изображения из галереи и т. Д.

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

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

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

person Brian Cooley    schedule 01.04.2011
comment
понял, это то, что я ищу - person Hamza; 19.09.2016
comment
Итак, могу ли я сказать, что мы устанавливаем Intent-filter, если хотим поддерживать действия / запросы извне нашего приложения? - person Asif Mushtaq; 16.01.2017

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

  1. Успешное совпадение, если ваш IntentFilter имеет категории, а Intent не предоставляет категории
  2. Успешное совпадение, если ваш IntentFilter имеет все категории Intent. В фильтре также могут быть дополнительные категории.
  3. Нет совпадений, если ваш IntentFilter не имеет категорий, а Intent имеет категории
  4. Нет совпадений, если ваш IntentFilter не имеет категорий, которые имеет Intent

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

person OneWorld    schedule 27.11.2014
comment
Итак, если у меня есть намерение с категориями a, b и фильтр намерения a, b, c, тогда фильтр захватывает намерение? - person JohnyTex; 22.08.2016
comment
Совершенно верно. Обратное не является обязательным - фильтр намерений может объявлять больше категорий, чем указано в намерении, и намерение все равно пройдет. developer.android.com/guide/components/ - person OneWorld; 22.08.2016