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


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

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

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

В соответствии с вышеизложенным предположением я попробовал код foloowing

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

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

3 2

3 ответа:

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

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

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

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