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