В чем разница между явным и неявным вызовом активности в Android? Если вы объясните ответ на простом примере, будет хорошо.
В чем разница между явным и неявным вызовом активности в Android?
Ответы (7)
Например:
неявный вызов активности
В фильтре намерений вы создаете действие для своей активности, поэтому другое приложение может вызывать вашу активность с помощью этого действия следующим образом:
<activity android:name=".BrowserActivitiy" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
И другой способ вызвать неявное намерение ниже:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);
Явный вызов активности
Вы делаете вызов, который указывает, какой именно класс активности:
Intent intent = new Intent(this, ActivityABC.class);
intent.putExtra("Value", "This value for ActivityABC");
startActivity(intent);
Надеюсь, это поможет вам лучше понять явный и неявный вызов активности в android.
Подробнее об Android Intent можно узнать здесь
- Явные намерения используются для вызова определенного компонента. Когда вы знаете, какой компонент вы хотите запустить, и вы не хотите давать пользователю свободный контроль над тем, какой компонент использовать. Например, у вас есть приложение, которое имеет 2 действия. Действие A и действие B. Вы хотите запустить действие B из действия A. В этом случае вы определяете явное намерение, нацеленное на действие B, а затем используете его для прямого вызова.
- Неявные намерения используются, когда у вас есть представление о том, что вы хотите сделать, но вы не знаете, какой компонент следует запустить. Или, если вы хотите дать пользователю возможность выбирать между списком компонентов для использования. Если эти намерения отправляются в систему Android, она ищет все компоненты, зарегистрированные для определенного действия и типа данных. Если найден только один компонент, Android запускает этот компонент напрямую. Например, у вас есть приложение, которое использует камеру для съемки фотографий. Одной из особенностей вашего приложения является то, что вы даете пользователю возможность отправлять сделанные им фотографии. Вы не знаете, какое приложение у пользователя может отправлять фотографии, и вы также хотите дать пользователю возможность выбрать, какое внешнее приложение использовать, если у него их несколько. В этом случае вы не будете использовать явное намерение. Вместо этого вы должны использовать неявное намерение, в котором для действия установлено значение ACTION_SEND, а для дополнительных данных установлено значение URI фотографии.
Явное намерение всегда доставляется к цели, независимо от того, что оно содержит; фильтр не консультируется. Но неявное намерение доставляется компоненту только в том случае, если оно может пройти через один из фильтров компонента.
См. Разрешение намерений здесь
http://developer.android.com/guide/topics/intents/intents-filters.html
Явные намерения (действия) относятся к определенному классу и, как правило, доступны только для ваших пакетов. Неявные намерения относятся к фильтрам намерений, когда приложения публично объявляют, что они могут обрабатывать определенные типы данных или могут предоставлять определенные услуги, например. Отправить письмо. С неявными намерениями пользователи выбирают, какое действие (обычно пакет) использовать для обработки намерения, или, если установлен обработчик по умолчанию, он запускается.
Когда какой использовать?
Явное намерение: когда вы знаете, какой компонент может обработать ваш запрос. Таким образом, вы явно указываете имя этого компонента в намерении.
Intent i = new Intent(context,DetailActivity.class); // DetailActivity.class is the component name
startActivity(i);
Неявное намерение: если вы не знаете, какое приложение может обработать ваш запрос, тогда вы указываете действие в намерении и позволяете ОС решить, какие приложения подходят для него. твое задание.
Пример: Воспроизведение музыки
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(file);
startActivity(intent);
Как решает ОС?
Когда есть неявный вызов с намерением, ОС выполняет действие, а затем оно сопоставляется со всеми фильтрами намерений всех зарегистрированных действий всех приложений с помощью PackageManager, а затем заполняет результат в виде списка. Это называется разрешение намерений
. вероятность того, что на вашем устройстве нет приложения, которое может обработать ваш запрос. В этом случае вы получите исключение NullPointer.
Таким образом, более безопасным способом вызова неявного намерения было бы это
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
Каждый раз я путаюсь среди них в том или ином интервью. Итак, я резюмировал это так, может это поможет кому-то помнить об этой разнице.
Обзор:
В Неявных намерениях пользователь неявно сообщает системе, ЧТО нужно сделать, не указывая, кто должен это делать.
В Явных намерениях пользователь явно указывает системе WHOM запускаться для любой работы.
Существует два типа намерений:
Явное намерение:
При создании объекта Intent, когда мы явно указываем и передаем имя целевого компонента непосредственно в намерении, это явное намерение.
Неявное намерение:
В этом случае мы делегируем задачу оценки зарегистрированных компонентов (регистрация обычно выполняется с использованием фильтров намерений, которые мы рассмотрим позже) Android на основе данных намерения и предполагаемого действия (например, отправить электронное письмо, сделать снимок, закрепить местоположение). на карте и т. д.), которые мы проезжаем. Таким образом, Android автоматически запускает компонент из того же приложения или другого приложения, которое может обрабатывать сообщение/задание о намерениях. Идея в этом случае заключается в том, что, скажем, нам нужно закрепить местоположение на map, для этого нам не нужно кодировать нашу собственную активность, чтобы справиться с этим. Вместо этого просто передайте данные о местоположении в приложение, такое как карты Google, которое может выполнять работу от имени нашего приложения.
источник: http://codetheory.in/android-intents/
Неявное намерение не определяет компонент. Намерение предоставляет информацию о компоненте.
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent);
тогда как Явное намерение указывает компонент. Намерение предоставляет информацию о классе.
Intent i = new Intent(this, ClassB.class);
startActivity(i);