Android неявные намерения против явных намерений - PullRequest
58 голосов
/ 26 мая 2010

Работая с Android, я понял, что неявные намерения являются хорошим выбором в большинстве случаев из-за их гибкости. Но как насчет явных намерений? Каковы преимущества их использования? В каких случаях их лучше использовать?

Ответы [ 9 ]

117 голосов
/ 11 ноября 2012

Implicit Intents напрямую не указывает компоненты Android, которые должны быть вызваны, он только указывает действие, которое должно быть выполнено. Uri может использоваться с неявным намерением для указания типа данных.

например

Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com"));

это приведет к открытию веб-браузера. Система Android ищет все компоненты, которые зарегистрированы для определенного действия и типа данных. Если найдено много компонентов, пользователь может выбрать, какой компонент использовать ..

Явные намерения используются в самом приложении, в котором одно действие может переключиться на другое действие ... Пример Intent intent = new Intent(this,Target.class); это вызывает переключение действия из текущего контекста в целевое действие. Явные намерения также можно использовать для передачи данных в другое действие с использованием метода putExtra и извлечения с помощью целевого действия с помощью методов getIntent().getExtras().

Надеюсь, это помогло.

24 голосов
/ 26 мая 2010

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

20 голосов
/ 07 октября 2013
  1. Явные намерения используются для вызова определенного компонента. Когда вы знаете, какой компонент вы хотите запустить, и не хотите предоставлять пользователю свободный контроль над тем, какой компонент использовать. Например, у вас есть приложение, которое имеет 2 действия. Действие A и действие B. Вы хотите запустить действие B из действия A. В этом случае вы определяете явное намерение, нацеленное на действиеB, а затем используете его для прямого вызова.

  2. Неявные намерения используются, когда у вас есть представление о том, что вы хотите сделать, но вы не знаете, какой компонент следует запустить. Или, если вы хотите дать пользователю возможность выбирать между списком компонентов для использования. Если эти Интенты отправляются в систему Android, то выполняется поиск всех компонентов, которые зарегистрированы для конкретного действия и типа данных. Если найден только один компонент, Android запускает компонент напрямую. Например, у вас есть приложение, которое использует камеру для фотографирования. Одной из особенностей вашего приложения является то, что вы предоставляете пользователю возможность отправлять сделанные им фотографии. Вы не знаете, какое приложение имеет пользователь, который может отправлять фотографии, и вы также хотите дать пользователю возможность выбрать, какое внешнее приложение использовать, если у него более одного. В этом случае вы не будете использовать явное намерение. Вместо этого вам следует использовать неявное намерение, действие которого установлено в ACTION_SEND, а дополнительные данные - в URI фотографии.

    Явное намерение всегда доставляется к цели, независимо от того, что оно содержит; с фильтром не справляются. Но неявное намерение доставляется компоненту, только если он может пройти через один из фильтров компонента

12 голосов
/ 23 апреля 2014

1) Явное намерение: разработчик знает имя компонента, имя указано в намерении.

2) Неявное намерение: Не указан компонент в намерении.

7 голосов
/ 22 декабря 2017

КЛЮЧ: Когда ты знаешь, а когда не знаешь

Явное намерение:

Используйте явное намерение, когда точно знаете, какой Activity может обработать ваш запрос.

Пример: у вас есть действие «Список», и когда вы щелкаете элемент в списке, он открывает действие «Деталь». В этом случае вы ЗНАЕТЕ , что сведения об элементе могут быть показаны или обработаны DetailActivity.class вашего приложения. Таким образом, чтобы выполнить это действие, вы создаете Intent, явно указав имя класса.

Intent showDeatil = new Intent(this,DetaiActivy.class);  
startActivity(showDeatil);

Скрытое намерение :

Используйте неявное намерение, когда вы не знаете, какая деятельность какого приложения / приложений может обработать ваш запрос.

Пример: у вас есть ссылка. Когда вы нажимаете на ссылку, она должна открывать веб-страницу в каком-либо браузере. Вы НЕ ЗНАЕТЕ , какие именно действия, в которых приложение может обработать ваш запрос. Вы просто имеете смутное представление, что это ссылка на веб-страницу, поэтому она должна открывать веб-страницу в каком-либо браузере, когда кто-то ее открывает. В этом случае вы просто указываете ДЕЙСТВИЕ, а остальная часть заботится об ОС.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

БОНУС:

Как решает ОС?

Для этого есть термин. Это называется намеренным разрешением.
Намеренное разрешение.

  • ОС принимает ДЕЙСТВИЕ, указанное в вашем намерении.

  • Заходит в PackageManager и ищет все зарегистрированные действия с соответствующими действиями все приложения, установленные на вашем устройстве.

  • Показывает список всех соответствующих приложений во всплывающем окне.

Более безопасный способ написания неявных намерений.

Иногда возможно, что не будет никакой активности, соответствующей действию. В этом случае вы получите исключение NullPointerException. Так что более предпочтительный способ это

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

Как заставить ваше приложение попасть в этот всплывающий список?

Допустим, вы написали какое-то приложение для браузера. Если вы хотите, чтобы ваши приложения отображались во всплывающем списке, когда кто-то открывает ссылку. Затем вам нужно зарегистрировать свою активность с действием, используя файл Intent Filters AndroidManifest.xml. Вот так.

<application
    .....  >

    ......
    <activity android:name=".YourBrowserActivity">
        <action android:name="android.intent.action.VIEW" />       
        <data android:scheme="http" android:host="www.example.com" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    </activity>
 ..... 


</application>

Ссылки
Список общих намерений и список их фильтров-намерений
Подробнее о фильтрах намерений и разрешении намерений

3 голосов
/ 23 мая 2017

С Документы :

Существует два типа намерений:

  • Явные намерения указывают компонент для запуска по имени (полное имя класса). Как правило, вы будете использовать явное намерение для запуска компонента в своем собственном приложении, потому что вы знаете имя класса действия или службы, которую вы хотите запустить. Например, вы можете запустить новое действие в ответ на действие пользователя или запустить службу для загрузки файла в фоновом режиме.
  • Неявные намерения не называют конкретный компонент, а вместо этого объявляют общее действие для выполнения, которое позволяет компоненту из другого приложения обрабатывать его. Например, если вы хотите показать пользователю местоположение на карте, вы можете использовать неявное намерение запросить, чтобы другое способное приложение показало указанное местоположение на карте.
2 голосов
/ 13 октября 2016
  1. Неявное намерение - когда мы хотим вызвать системные компоненты через намерение выполнить определенную задачу, и мы на самом деле не знаем названия используемых компонентов, система Android покажет желаемый список приложений для выполнения задача.
  2. Явное намерение - когда мы хотим вызвать другое действие с полным квалифицированным именем действия и, конечно, мы знаем имя действия.
1 голос
/ 21 октября 2018

Просто мы можем описать оба намерения следующим образом.

Явное содержание: Они используются для связи между двумя действиями в одном приложении.

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

Скрытые намерения: Они используются для связи между двумя действиями различных приложений.

Например: рассмотрим новостное приложение, в котором описывается авария, в которой видео аварии записано и загружено в Facebook. При нажатии на ссылку, указанную в приложении новостей, он направит нас в Facebook. В этом случае связь происходит между действием в приложении новостей и действием в приложении Facebook. Для этой цели мы используем Implicit Intents.

Я надеюсь, вы понимаете.

0 голосов
/ 26 марта 2019

Неявное намерение

  • Вызывает новое приложение, не указывая, какое из них подтянуть.
  • Указывает только действие, которое нужно выполнить, и не указывает напрямую компоненты Android.
  • URI может использоваться с неявным намерением для указания типа данных.

Явное намерение

  • Это вызовет конкретное приложение и настроенопри написании кода.
  • Он используется в самом приложении, в котором одно действие может переключиться на другое действие.
  • Используется для передачи данных в другое действие с использованием дополнительного метода put и извлечения целевым действием getIntent ().
  • Он всегда доставляется к цели, даже если с фильтром не обращаются.
...