内隐意图在内部进行广播吗?

时间:2014-05-15 14:07:52

标签: android android-intent android-broadcast

下面一段代码使用隐式intent打开一个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 个答案:

答案 0 :(得分:1)

  

因此,我假设此程序在内部通过动作Intent.ACTION_VIEW进行广播。

没有

  

但它不起作用。没有显示

当然。

  

有什么区别。

startActivity()!= sendBroadast()。它们是单独的操作,就像加法和减法是单独的数学运算一样。

如果您希望将Intent系统视为有点像消息总线,那么该总线有三个完全独立的通道:

  • 活动(startActivity()
  • 服务(startService()bindService()
  • 广播(sendBroadcast()sendOrderedBroadcast()等)

答案 1 :(得分:1)

这两者之间的差异就是谁收到了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而没有其他内容一样。

您可以找到更多信息here

答案 2 :(得分:1)

这与IntentFilters有关。在启动Activity之前,系统会要求系统为其提供Activity所有内容的列表,并且可以处理意图 - 此处不涉及广播。

对于sendBroadcast() - 它与BroadcastReceiver s基本相同。机制是相同的:匹配意图过滤器,提供Intent,但Intent被传递给所有接收者,无论其数量(与startActivity()做什么相反 - 因为它只能导致单个活动开始,因此如果有多个匹配,则需要选择一个活动。

我认为BroadcastReceivers没有Intent.ACTION_VIEW注册(因为它是一项旨在开展活动的行动,没有合理的理由听取它并开始什么,除了计数活动启动或其他事情)但你可以自己注册一个,看看会发生什么。