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