下面一段代码使用隐式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);
但它不起作用。没有显示任何内容。有什么不同。有人可以清除我的困惑吗?
答案 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
注册(因为它是一项旨在开展活动的行动,没有合理的理由听取它并开始什么,除了计数活动启动或其他事情)但你可以自己注册一个,看看会发生什么。