Неявные намерения делают трансляцию внутри?
Следующий фрагмент кода открывает 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()
- это по сути то же самое, но для BroadcastReceiver
s. Механизм тот же: сопоставьте фильтры намерений, доставьте 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
и ничего больше.
Вы можете найти больше информации здесь.