Чем отличается явный и неявный вызов активности в android?
в чем разница между явным и неявным вызовом активности в android? Если вы объясните ответ простым примером, это будет хорошо.
5 ответов
например:
неявных вызовов
в intent filter вы создаете действие для своей активности, поэтому другое приложение может вызвать вашу активность с помощью этого действия следующим образом:
<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);
i.putExtra("Value", "This value for ActivityABC");
startActivity(intent);
надеюсь, что это поможет вам понять подробнее о явном и неявном вызове активности в android.
вы можете получить более подробную информацию о Android Intent здесь
- явные намерения используются для вызова определенного компонента. Когда вы знаете, какой компонент вы хотите запустить, и вы не хотите давать пользователю свободный контроль над тем, какой компонент использовать.Например, у вас есть приложение, которое имеет 2 деятельности. Действие A и действие B. Вы хотите запустить действие B Из действия A. В этом случае вы определяете явное намерение, нацеленное на activityB, а затем используете его для прямого вызова.
- неявные намерения используются, когда у вас есть идея того, что вы хотите сделать, но вы не знаете, какой компонент должен быть запущен. Или если вы хотите предоставить пользователю возможность выбора между списком используемых компонентов. Если эти намерения отправляются в систему Android, она ищет все компоненты, которые зарегистрированы для конкретного действия и типа данных. Если найден только один компонент, Android запускает компонент напрямую. Например, у вас есть приложение, которое использует камеру для съемки фотографий. Одна из особенностей вашего приложение заключается в том, что вы даете пользователю возможность отправлять сделанные им фотографии. Вы не знаете, какое приложение пользователь может отправлять фотографии, и вы также хотите дать пользователю возможность выбрать, какое внешнее приложение использовать, если у него есть более одного. В этом случае вы не будете использовать явное намерение. Вместо этого следует использовать неявное намерение, действие которого имеет значение ACTION_SEND, а дополнительные данные-URI фотографии.
явный намерение всегда доставляется к цели, независимо от того, что оно содержит; с фильтром не консультируются. Но неявное намерение доставляется компоненту только в том случае, если оно может пройти через один из фильтров компонента
см. разрешение намерения здесь
http://developer.android.com/guide/topics/intents/intents-filters.html
явные намерения (действия) относятся к определенному классу и, как правило, доступны только для ваших пакетов. Неявные намерения относятся к фильтрам намерений, где приложения публично объявляют, что они могут обрабатывать определенные типы данных или предоставлять определенные услуги, например, отправлять электронную почту. С неявными намерениями пользователи выбирают, какое действие (обычно пакет) для обработки намерения или если установлен обработчик по умолчанию, он запускается.
существует два типа намерений:
-
Явный Умысел:
при создании объекта Intent, когда мы явно указываем и передаем имя целевого компонента непосредственно в intent, это явное намерение.
-
Косвенным Умыслом:
в этом случае мы делегируем задачу оценки зарегистрированных компонентов (регистрация обычно выполняется с использованием фильтров намерений это мы рассмотрим позже) на Android на основе данных о намерениях и предполагаемых действий (например, отправить электронное письмо, захватить фотографию, местоположение pin-кода на карте и т. д.), что мы проходим. Так что Android автоматически запустит компонент из того же приложения или другого приложения, которое может обрабатывать сообщение/задание намерения. идея в этом случае заключается в том, что, скажем, мы должны закрепить местоположение на карте, для этого нам не нужно кодировать нашу собственную деятельность, чтобы справиться с этим. Вместо этого просто передайте данные о местоположении в приложение как Google maps, которые могут сделать работу от имени нашего приложения.
источник : http://codetheory.in/android-intents/
когда какую использовать?
явный умысел: когда вы знаете, какой компонент может обработать ваш запрос. Так ты явно укажите это имя компонента в намерениях.
Intent i = new Intent(context,DetailActivity.class); // DetailActivity.class is the component name
startActivity(i);
косвенным умыслом: когда вы не знаете, какое приложение может обработать ваш запрос вы упомянули действие in intent и пусть ОС решит, какое приложение/s подходит / подходит для вашей задачи.
Пример: Играть музыка
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);
}