Неявные намерения делают трансляцию внутри?

Следующий фрагмент кода открывает URL с использованием неявного намерения.

EditText editText  = (EditText) findViewById(R.id.url_editText);
                Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(editText.getText().toString()));
                startActivity(myIntent);

Он показывает все приложения, которые поддерживают это действие Intent.ACTION_VIEW, такие как Chrome, Firefox и т. Д. Следовательно, я предполагаю, что эта процедура внутренне выполняет трансляцию с действием Intent.ACTION_VIEW. Пожалуйста, поправьте меня, если я неправильно понял.

В соответствии с приведенным выше предположением я попробовал следующий код

Intent myIntent = new Intent(Intent.ACTION_VIEW);
sendBroadcast(myIntent);

Но это не работает. Ничего не показано. В чем разница. Может кто-нибудь очистить мою путаницу?

3 ответа

Решение

Это связано с IntentFilters. Перед запуском Activityпросит систему предоставить список всего, что Activity и может справиться с намерением - здесь нет трансляции.

Что касается sendBroadcast() - это по сути то же самое, но для BroadcastReceivers. Механизм тот же: сопоставьте фильтры намерений, доставьте Intent, но Intent доставляется всем получателям независимо от их количества (в отличие от того, что startActivity() делает - потому что это может привести только к запуску одного действия, следовательно, необходимо выбрать один, если есть несколько, которые соответствуют).

Я не думаю, что есть какие-либо BroadcastReceivers зарегистрирован для Intent.ACTION_VIEW (поскольку это действие, целью которого является запуск действия, нет логической причины его прослушивать и ничего не начинать, кроме подсчета запусков активности или чего-то еще), но вы можете зарегистрировать его самостоятельно и посмотреть, что произойдет.

Следовательно, я предполагаю, что эта процедура внутренне выполняет вещание с действием Intent.ACTION_VIEW.

Нет.

Но это не работает. Ничего не показано

Конечно.

В чем разница.

startActivity() знак равно sendBroadast(), Это отдельные операции, так же как сложение и вычитание являются отдельными математическими операциями.

Если вы хотите думать о Intent Система, которая немного похожа на шину сообщений, имеет три совершенно отдельных канала:

  • деятельность (startActivity())
  • Сервисы (startService(), bindService())
  • трансляции (sendBroadcast(), sendOrderedBroadcast(), так далее.)

Разница между этими двумя заключается только в том, кто получает Intent, Если вы позвоните sendBroadcast() Intent будет отправлен BroadcastReceivers, Если вы позвоните startActivity() Intent будет отправлен Activities, Вот почему это так:

Intent myIntent = new Intent(Intent.ACTION_VIEW);
sendBroadcast(myIntent);

Не запускается Activity, поскольку Intent виден только BroadcastReceivers,

То же самое касается startService(), Вызывая этот метод Intent будет только целью Services, Я думаю, что путаница происходит от слова вещания. Это означает, что оно отправлено везде и видно всем, но это не так. Трансляции видны только BroadcastReceivers так же, как если вы позвоните startActivity() Intent будет только целью Activities и ничего больше.

Вы можете найти больше информации здесь.

Другие вопросы по тегам